java非捕获组-肯定式向前查找(?=)和肯定式向后查找(?<=)

先上例子:

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.

其他几个分析类似,能看懂上面的例子的结果,应该也就明白了这两个非捕获组的区别。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值