不会正则表达式?看这篇就够了( 三 )

可见,分组个数是2,但是因为第0个为整个表达式本身,因此也一起输出了 。
 
命名编号捕获组
语法:(?exp)
解释:分组的命名由表达式中的name指定
比如区号也可以这样写:(?d{2})-(?d{8})
按照左括号的顺序,这个表达式有如下分组:序号名称分组内容00(0d{2})-(d{8})020-856533331quhao(0d{2})0202haoma(d{8})85653333
 
用代码来验证一下:
String test = "020-85653333";String reg="(?<quhao>0d{2})-(?<haoma>d{8})";Pattern pattern = Pattern.compile(reg);Matcher mc= pattern.matcher(test);if(mc.find()){ System.out.println("分组的个数有:"+mc.groupCount()); System.out.println(mc.group("quhao")); System.out.println(mc.group("haoma"));}输出结果:
分组的个数有:2分组名称为:quhao,匹配内容为:020分组名称为:haoma,匹配内容为:85653333非捕获组
语法:(?:exp)
解释:和捕获组刚好相反,它用来标识那些不需要捕获的分组,说的通俗一点,就是你可以根据需要去保存你的分组 。
比如上面的正则表达式,程序不需要用到第一个分组,那就可以这样写:(?:d{2})-(d{8})
序号编号分组内容00(0d{2})-(d{8})020-8565333311(d{8})85653333
 
验证一下:
String test = "020-85653333";String reg="(?:0d{2})-(d{8})";Pattern pattern = Pattern.compile(reg);Matcher mc= pattern.matcher(test);if(mc.find()){ System.out.println("分组的个数有:"+mc.groupCount()); for(inti=0;i<=mc.groupCount();i++){ System.out.println("第"+i+"个分组为:"+mc.group(i)); }}输出结果:
分组的个数有:1第0个分组为:020-85653333第1个分组为:856533333、反向引用
 
上面讲到捕获,我们知道:捕获会返回一个捕获组,这个分组是保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用 。
 
根据捕获组的命名规则,反向引用可分为:
 
数字编号组反向引用:k或 umber
命名编号组反向引用:k或者'name'
好了 讲完了,懂吗?不懂!!!
 
可能连前面讲的捕获有什么用都还不懂吧?
 
其实只是看完捕获不懂不会用是很正常的!
 
因为捕获组通常是和反向引用一起使用的 。
 
上面说到捕获组是匹配子表达式的内容按序号或者命名保存起来以便使用 。
 
注意两个字眼:“内容” 和 “使用” 。
 
这里所说的“内容”,是匹配结果,而不是子表达式本身,强调这个有什么用?嗯,先记住 。
 
那这里所说的“使用”是怎样使用呢?
 
因为它的作用主要是用来查找一些重复的内容或者做替换指定字符 。
 
还是举栗子吧 。
 
比如要查找一串字母"aabbbbgbddesddfiid"里成对的字母
 
如果按照我们之前学到的正则,什么区间啊限定啊断言啊可能是办不到的,
 
现在我们先用程序思维理一下思路:
 
1)匹配到一个字母
2)匹配第下一个字母,检查是否和上一个字母是否一样
3)如果一样,则匹配成功,否则失败
这里的思路2中匹配下一个字母时,需要用到上一个字母,那怎么记住上一个字母呢???
 
这下子捕获就有用处啦,我们可以利用捕获把上一个匹配成功的内容用来作为本次匹配的条件
 
好了,有思路就要实践
 
首先匹配一个字母:w
 
我们需要做成分组才能捕获,因此写成这样:(w)
 
那这个表达式就有一个捕获组:(w)
 
然后我们要用这个捕获组作为条件,那就可以:(w)
 
这样就大功告成了
 
可能有人不明白了,是什么意思呢?
 
还记得捕获组有两种命名方式吗,一种是是根据捕获分组顺序命名,一种是自定义命名来作为捕获组的命名
 
在默认情况下都是以数字来命名,而且数字命名的顺序是从1开始的
 
因此要引用第一个捕获组,根据反向引用的数字命名规则 就需要 k<1>或者
 
当然,通常都是是后者 。
 
我们来测试一下:
String test = "aabbbbgbddesddfiid";Pattern pattern = Pattern.compile("(w)1");Matcher mc= pattern.matcher(test);while(mc.find()){ System.out.println(mc.group());}


推荐阅读