Java正则表达式中的特殊构造

1、(?=X)  

X,通过零宽度的正 lookahead

 /*.{3}(?=a)代表着这样的功能:
    * 查找给出的字符串中符合a前面有三个字母的这样的子串,当然取得的子串不包括(?=a)
    */
   Pattern p = Pattern.compile(".{3}(?=a)"); 
   String s1 = "444a66b";
   Matcher m = p.matcher(s1);
   while (m.find()) {
       p(m.group());
   }


2、(?!X)

 

X,通过零宽度的负 lookahead


/**
    * 通过上面的(?=X)下面来测试和设想一下(?!a),api解释为
    * (?!X) X,通过零宽度的负lookahead,所以对比一下很容易想到
    * \\d{3}(?!a)代表着连续三个数字的后面出现的字符不是a的匹配,
    * 所以字符串444a666b只有一个匹配子串666
    * 字符串444b666b两个匹配444 666
    * 字符串444a666a都不匹配
    */
   p = Pattern.compile("\\d{3}(?!a)");//(?!X) X,通过零宽度的负lookahead 
   String s3 = "444b666b";
   m = p.matcher(s3);
   while (m.find()) {
       p(m.group());
   }


3、(?<=X)

X,通过零宽度的正 lookbehind

	
	String patternStr1 = "(?<=[a-z]+)(\\d)";
	Pattern p = Pattern.compile(patternStr1);
	Matcher m  = p.matcher("sdfafds8435423");
	while(m.find())
		System.out.println(m.group());
	}
//	运行结果:8

4、(?<!X)

X,通过零宽度的负 lookbehind

 

String patternStr1 = "(?<![a-z])(\\d+)";
	Pattern p = Pattern.compile(patternStr1);
	Matcher m  = p.matcher("sdfafds8435423");
	while(m.find())
		System.out.println(m.group());
	}
//	运行结果:435423

小结:前四种是一大类,behind 和 head 是说“目标/待查找字符串”的位置,正/负是条件字符串出现与否。

5、(?:X)  

X,作为非捕获组


public static void main(String[] args) {
	String patternStr1 = "([a-z]+)(?:\\d)";
	Pattern p = Pattern.compile(patternStr1);
	Matcher m  = p.matcher("sdfafds8435423");
	while(m.find())
                System.out.println(m.group(0));
		System.out.println(m.group(1));
		System.out.println(m.group(2));
	}
//运行结果:
//sdfafds8
//sdfafds
//	Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 2
//	at java.util.regex.Matcher.group(Unknown Source)
//	at lsp.SpecialConstrutor.main(SpecialConstrutor.java:18)


通过实验,(?:X)的作用是取消分组,不能使用group函数捕获该组,但grup(0)时仍然包含该组的内容。

非捕获组,其实这个对结果不影响的,只是说你这个括号不是分组,只是为了吧一段规则包含起来。因为保存分组需要时间和内存。使用非捕获组可以提升性能。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值