正则表达式的理解

正则表达式
* 是用来操作字符串,用一下具有特殊意义的符号,来匹配,分割,获取,替换字符串的操作,

* 代码简便了,但代码的可读性差了。。


正则表示式的一些常用符号:

 字符类 
[abc] a、b 或 c(简单类) 
[^abc] 任何字符,除了 a、b 或 c(否定) 
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) 
[a-z&&[def]] d、e 或 f(交集) 
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) 
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) 
  
预定义字符类 
. 任何字符(与行结束符可能匹配也可能不匹配) 
\d 数字:[0-9] 
\D 非数字: [^0-9] 
\s 空白字符:[ \t\n\x0B\f\r] 
\S 非空白字符:[^\s] 
\w 单词字符:[a-zA-Z_0-9] 
\W 非单词字符:[^\w] 
边界匹配器 
^ 行的开头 
$ 行的结尾 
\b 单词边界 
\B 非单词边界 
\A 输入的开头 
\G 上一个匹配的结尾 
\Z 输入的结尾,仅用于最后的结束符(如果有的话) 
\z 输入的结尾 
 
Greedy 数量词 
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 


简单的例子来说明正则表达式的用法:


* 需求:定义一个功能对QQ号进行校验。
* 要求:长度5~15. 只能是数字, 0不能开头


String qq = "4535434345";
String regex ="[1-9]\\d{4,14}"; 。//正则表达式的一种写法

//"[1-9][0-9]{4,14}"; 另一种写法,和上面的一种写法的效果完全一样。

boolean fls = qq.matches(regex);//直接操作,下面几行的简写,也可以写成下面的样式。

/*
 Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(qq);
boolean b = m.matches();*/


System.out.println(qq+":"+b);
}



/*
* 正则表达式对字符串的常见操作:
* 1, 匹配。
* 其实使用的就是String类中的matches方法。

* 2,切割。
* 其实使用的就是String类中的split方法。 

* 3,替换。
* 其实使用的就是String类中的replaceAll()方法。

* 4,获取。
*
*/




/*
* 获取 
* 将正则规则进行对象的封装。 
* Pattern p = Pattern.compile("a*b");
*  //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher .
  * Matcher m = p.matcher("aaaaab");
  * //通过Matcher匹配器对象的方法对字符串进行操作。
  * boolean b = m.matches();


*/
public  static void functionDemo_4() {

String str = "dae jia hao,ming tian bu fang jia!";

String regex = "\\b[a-z]{3}\\b";

//1,将正则封装成对象。
Pattern p = Pattern.compile(regex);
//2, 通过正则对象获取匹配器对象。 
Matcher m = p.matcher(str);

//使用Matcher对象的方法对字符串进行操作。
//既然要获取三个字母组成的单词 
//查找。 find();
System.out.println(str);
while(m.find()){
System.out.println(m.group());//获取匹配的子序列

System.out.println(m.start()+":"+m.end());
}
}


/*
* 替换 
*/
public static void functionDemo_3() {

String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";

str = str.replaceAll("(.)\\1+", "$1");

System.out.println(str);

String tel = "15800001111";//158****1111;

tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");

System.out.println(tel);

}


/*
* 切割。

* 组:((A)(B(C))) 
*/
public static void functionDemo_2(){


String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";

String[] names = str.split("(.)\\1+");//str.split("\\.");

for(String name : names){
System.out.println(name);
}

}
/*
* 演示匹配。 
*/
public static void functionDemo_1(){


//匹配手机号码是否正确。 
String tel = "15800001111";

String regex = "1[358]\\d{9}";   

boolean b = tel.matches(regex);
System.out.println(tel+":"+b);
}



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值