捕获分组的注意事项:
只要使用了括号,就存在捕获分组
捕获分组按照开括号出现的从左到右的顺序编号,遇到括号嵌套的情况也是如此
如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串
例子:
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;
public   class  GeneralSix {
public   static   void  main(String[] args) {
String email =  "abacdemasterhappy@163.com" ;
String regex =  "((\\w+)@([\\d\\.\\w]+))" ;
Pattern p = Pattern. compile (regex);
Matcher m = p.matcher(email);
if (m.find()){
System. out .println( "匹配结果:\t"  + m.group(0));
System. out .println( "分组1:\t"  + m.group(1));
System. out .println( "分组2:\t"  + m.group(2));
System. out .println( "分组3:\t"  + m.group(3));
}
}
}
运行结果:
匹配结果:   abacdemasterhappy@163.com
分组1:   abacdemasterhappy@163.com
分组2:   abacdemasterhappy
分组3:   163.com
String regex =  "((\\w+)@([\\d\\.\\w]+))" ;
只是在正则表达式的两端添加了一个( ),此时出现括号嵌套的情况。
依照括号从左到右的顺序,发现,第一个括号对应整个正则表达式,第二个对应用户名正则表达式,第三个括号用于匹配主机名的正则表达式。
再看一个:
public   class  GeneralSeven {
public   static   void  main(String[] args) {
String email =  "abacdemasterhappy@163.com" ;
String regex =  "(\\w)+@([\\d\\.\\w])+" ;
Pattern p = Pattern. compile (regex);
Matcher m = p.matcher(email);
if (m.find()){
System. out .println( "匹配结果:\t"  + m.group(0));
System. out .println( "分组1:\t"  + m.group(1));
System. out .println( "分组2:\t"  + m.group(2));
System. out .println( "分组3:\t"  + m.group(3));
}
}
}
运行结果:
匹配结果:   abacdemasterhappy@163.com
分组1:   y
分组2:   m
将量词作用整个捕获分组。匹配完成之后,捕获分组所保存的就是最后一次它所匹配的文本。
abacdemasterhapp y @163.co m
相当于匹配用户名的最后一个字符。
捕获分组的事项讲解到此!
不捕获文本的括号
如果正则表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率
作用:仅仅用来对表达式分组,而不把分组捕获的文本存入结果
形式:
· (?:...)
注意: 不捕获文本的括号,并不是所有语言都有提供,为了增加可读性,并不推荐使用“不捕获文本的括号”。
例子:
public   class  GeneralEight {
public   static   void  main(String[] args) {
String email =  "abacdemasterhappy@163.com" ;
String regex =  "(?:abacdemasterhappy|admin)@(163.com)" ;
Pattern p = Pattern. compile (regex);
Matcher m = p.matcher(email);
if (m.find()){
System. out .println( "匹配结果:\t"  + m.group(0));
System. out .println( "分组1:\t"  + m.group(1));
}
}
}
运行结果:
匹配结果:   abacdemasterhappy@163.com
分组1:   163.com
括号的用途:反向引用
作用:在表达式的某一部分, 动态重复 之前子表达式所匹配的文本
形式: \1
例子:
public   class  GeneralNine {
public   static   void  main(String[] args) {
String[] strs =  new  String[] {  "<h1>good,good</h1>" "<h1>bad</h2>" };
String regex =  "<\\w+>[^<]+</\\w+>" ;
for  (String string : strs) {
if ( regexMatch (string,regex)){
System. out .println(string + "能够匹配正则:"  + regex);
} else {
System. out .println(string + "不能够匹配正则:"  + regex);
}
}
}
private   static   boolean  regexMatch(String s, String regex) {
return  s.matches(regex);
}
}
运行结果:
<h1>good,good</h1>能够匹配正则:<\w+>[^<]+</\w+>
<h1>bad</h2>能够匹配正则:<\w+>[^<]+</\w+>
未完待续。。。