java非捕获组-肯定式向前查找(?=)和肯定式向后查找(?<=)
2017-08-26 09:47
495 查看
先上例子:
运行结果:
Matched string: aaabaaaa
pattern aa(?<=aa)\w{2}:
match begin 0: aaab
match begin 4: aaaa
pattern aa(?=aa)\w{2}:
match begin 4: aaaa
pattern (?<=aa)\w{2}:
match begin 2: ab
match begin 6: aa
pattern \w{2}(?<=aa):
match begin 0: aa
match begin 4: aa
match begin 6: aa
pattern (?=aa)\w{2}:
match begin 0: aa
match begin 4: aa
match begin 6: aa
pattern \w{2}(?=aa):
match begin 2: ab
match begin 4: aa
分析:
(?=):肯定式向前查找,意思是这个非捕获组只影响前边的正则表达式匹配。
(?<=):肯定式向后查找,意思是这个非捕获组只影响后边的正则表达式匹配。
所以,对字符串 "aaabaaaa" ,
1、"aa(?<=aa)\\w{2}" 的匹配结果有两组,先是从位置0开始,有两个a,满足 正则"aa" ,又因为正则 "(?<=aa)" 是非捕获组且肯定式向后查找,只影响后边的正则表达式匹配,所以,正则 "(?<=aa)"匹配"到了位置0和1,正则"\\w{2}" 从位置2开始, 匹配位置2和3。于是, 匹配结果是 “aaaa”(0到3)、 "aaaa"(4到7).
2、"aa(?=aa)\\w{2}" 的匹配结果只有一组,先是从位置0开始,有两个a,满足正则"aa",又因为正则"(?=aa)"是非捕获组且肯定式向前查找(重点),只影响前边的正则表达式匹配,所以,正则"(?=aa)"从位置3开始查找,不匹配字符串"aaabaaaa" 的2、3位置。于是,正则表达式重新从位置4开始查找,最后匹配到位置4到7.
其他几个分析类似,能看懂上面的例子的结果,应该也就明白了这两个非捕获组的区别。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Hello { public static void main(String[] args) { // 正则表达式数组 String[] regs = new String[] { "aa(?<=aa)\\w{2}", "aa(?=aa)\\w{2}", "(?<=aa)\\w{2}", "\\w{2}(?<=aa)", "(?=aa)\\w{2}", "\\w{2}(?=aa)" }; // 匹配正则表达式的字符串 String s = "aaabaaaa"; // 输出被匹配的字符串 System.out.println("Matched string: " + s); System.out.println(); for(String reg : regs) { testReg(reg, s); System.out.println(); } } public static void testReg(String reg, String s) { Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern.matcher(s); System.out.println("pattern " + reg + ":"); while(matcher.find()) { System.out.println("match begin " + matcher.start() + ": " + matcher.group()); } } }
运行结果:
Matched string: aaabaaaa
pattern aa(?<=aa)\w{2}:
match begin 0: aaab
match begin 4: aaaa
pattern aa(?=aa)\w{2}:
match begin 4: aaaa
pattern (?<=aa)\w{2}:
match begin 2: ab
match begin 6: aa
pattern \w{2}(?<=aa):
match begin 0: aa
match begin 4: aa
match begin 6: aa
pattern (?=aa)\w{2}:
match begin 0: aa
match begin 4: aa
match begin 6: aa
pattern \w{2}(?=aa):
match begin 2: ab
match begin 4: aa
分析:
(?=):肯定式向前查找,意思是这个非捕获组只影响前边的正则表达式匹配。
(?<=):肯定式向后查找,意思是这个非捕获组只影响后边的正则表达式匹配。
所以,对字符串 "aaabaaaa" ,
1、"aa(?<=aa)\\w{2}" 的匹配结果有两组,先是从位置0开始,有两个a,满足 正则"aa" ,又因为正则 "(?<=aa)" 是非捕获组且肯定式向后查找,只影响后边的正则表达式匹配,所以,正则 "(?<=aa)"匹配"到了位置0和1,正则"\\w{2}" 从位置2开始, 匹配位置2和3。于是, 匹配结果是 “aaaa”(0到3)、 "aaaa"(4到7).
2、"aa(?=aa)\\w{2}" 的匹配结果只有一组,先是从位置0开始,有两个a,满足正则"aa",又因为正则"(?=aa)"是非捕获组且肯定式向前查找(重点),只影响前边的正则表达式匹配,所以,正则"(?=aa)"从位置3开始查找,不匹配字符串"aaabaaaa" 的2、3位置。于是,正则表达式重新从位置4开始查找,最后匹配到位置4到7.
其他几个分析类似,能看懂上面的例子的结果,应该也就明白了这两个非捕获组的区别。
相关文章推荐
- java中使用向前查找和向后查找
- Java时间就近取整:<=30分向前取整点,>30分向后取整点
- java中使用向前查找和向后查找
- zookeeper学习之java api查找并删除节点<五>
- <CoreJava> 11.2 捕获异常
- 正则表达式向前查找和向后查找
- 正则向前查找和向后查找
- java 正则(4) 不常用 / 贪婪匹配 / 非捕获组 / 向前引用 / flag 简写
- 关于Java中“+”加运算符和“<<”向前移位运算符混合使用时出现的错误
- java获取字符串格式日期向前或向后n天的日期
- 正则表达式入门经典(学习笔记六)——向前查找(lookahead)和向后查找(lookbehind)
- 正则表达式学习笔记(6)向前查找和向后查找
- java获取字符串格式日期向前或向后n天的日期
- 正则的向前查找和向后查找
- 正则表达式学习笔记(6)向前查找和向后查找
- java中处理日期 日期向前推 日期向后 推
- java web中web.xml中<servlet>和<servlet-mapping>的理解
- _java基础<一>_Java开发前奏
- <Java>RandomAccessFile在文件中定位写入