正则表达式

Java版

Java提供了两个类用来进行正则表达式的匹配

Pattern Matcher 两个类都没有公共的构造方法,只能通过静态方法创建对象。

 

限定符:及规定匹配字符的个数,比如?,+,*,{n},{n,}{n,m}等,默认只匹配一次

贪婪:默认匹配的都是可能长的字符

非贪婪:?当次字符紧随其他限定符时,都是尽可能匹配短的字符串

 

 

通过Pattern.compile(regex).matcher(input) 返回的pattern实例的matcher方法构造Matcher对象。

 

 

Matcher对象匹配结果查询

find() 如果匹配有结果,返回真,没有匹配到,返回假。查找下一个匹配的结果,要在循环中查找到全部的结果。

find(int start) 重置匹配器,从在原子符start开始进行匹配。

start() 返回匹配到的第一项的在原子符的偏移量。

end() 返回匹配到的最后一项在原子符的偏移量+1。

 

group() 返回得到的匹配结果,从substring(start(),end()) 得到的结果相同

 

find()在循环中迭代得到全部的匹配结果 从 end()-start() 可以得知每次匹配到字符的长度

 

String pattern1="[A-Za-z]";
   Pattern pattern= Pattern.compile(pattern1);
   String input="345rf4";
   Matcher matcher=pattern.matcher(input);

   while (matcher.find()){
       System.out.println("start:"+matcher.start());
       System.out.println("end:"+matcher.end());
       System.out.println("length:"+(matcher.end()-matcher.start()));
       System.out.println("matcher: "+input.substring(matcher.start(),matcher.end()));
       System.out.println("group: "+matcher.group());

  }
}
/*
start:3
end:4
length:1
matcher: r
group: r
start:4
end:5
length:1
matcher: f
group: f
*/

 

matches() 尝试将整个input字符与正则表达式匹配,如果匹配成功返回真,否则返回假。

String pattern1="[A-Za-z]{1,}";
Pattern pattern= Pattern.compile(pattern1);
String input="rfg";
Matcher matcher=pattern.matcher(input);
boolean f= matcher.matches();  //rfg与整个正则表达式匹配,能匹配成功,如果是匹配rfg34 不能匹配成功,因为有数字34不能与正则表达式匹配,返回假
System.out.println(f);

 

mathes() 与find() 的区别,是find逐步查找input字符串符合正则表达式的部分。

 

 

正则表达式中的 [] 和 ()的区别:

[a-z] 是范围匹配,匹配a-z的任意一个字符

(a-z) 是全部匹配,匹配的是a-z的全部字符,匹配一个连续的子串

 

int groupCount() 返回一共的匹配组

string group(int group) 返回第几个匹配分组的结果,如果没有返回null,从第1个分组开始,第0个是一个特殊的分组,它代表整个表达式,所以它每次都有返回结果。

 

捕获组,正则表达式regex中使用括号()包囊起来的分组,捕获组是从左到右开始计算其开括号来编号的。

例如:((A)(B(C))),一共有4个分组,从0-3分别是

1:((A)(B(C))) ; 2:(A) ; 3: (B(C)) ; 4:(C)

 

String pattern1="(a)|(A)";
Pattern pattern= Pattern.compile(pattern1);
String input="aarAfg45";
Matcher matcher=pattern.matcher(input);

while (matcher.find()){
   
   System.out.println("matcher: "+input.substring(matcher.start(),matcher.end()));
   System.out.println("group: "+matcher.group(0));
   System.out.println("第1个分组(a):"+matcher.group(1));
   System.out.println("第2个分组(A):"+matcher.group(2));

}
/*
matcher: a
group: a
第1个分组(a):a
第2个分组(A):null
matcher: a
group: a
第1个分组(a):a
第2个分组(A):null
matcher: A
group: A
第1个分组(a):null
第2个分组(A):A
2

*/

 

替换

String pattern1="(a)|(A)";
Pattern pattern= Pattern.compile(pattern1);
String input="aarAfg45";
Matcher matcher=pattern.matcher(input);
System.out.println(input);
String s=matcher.replaceAll("&");
System.out.println(s);
String s1=matcher.replaceFirst("&");
System.out.println(s1);
/*
原来的=aarAfg45
s=&&r&fg45
s1=&arAfg45
*/

 

 

PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。

 

字符串的替换,切割,匹配等方法都是基于正则匹配。

字符串的mathes方法是全局匹配,底层是使用Matcher对象的matches方法,而不是find方法。

 

 

posted @ 2020-10-23 15:22  lfcom  阅读(122)  评论(0编辑  收藏  举报