正则表达式中有几个规则在一般情况下很少用到,今天有时间就在JAVA中测试了这几个规则运行效果。
预搜索(?=)
(?=xxxxx)在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧 ,必须能够匹配上 xxxxx 这部分的表达式。
测试正则表达式:pattern=(.*?)(?=XP)
测试字符串:testStr1="Windows XP" testStr2="XP1aaaaaa_XP2Windows_XP3A"
首先打印testStr1.replaceAll(pattern,"")的结果为"XP",匹配结果是"Windows ",这个结果完全符合前面关于?=的定义。
然后打印testStr2.replaceAll(pattern,"")的结果,发现结果却是"XXXP3A",匹配结果变成了"P1aaaaaa_"+"P2Windows_",我预想中的结果应该是"1aaaaaa_"+"2Windows",只有这2段字符串的右侧是“XP"字符串,现在在替换的时候却多替换了2个'P'字符,为得到预想中的结果将测试正则表达式修改为pattern=(.*?)(?=[XP]+),这个时候再运行testStr2.replaceAll(pattern,""),发现结果变成了预想中的"XPXPXP3A"。对于第一个表达式为什么会出现那样的匹配结果并不是很清楚,查阅JAVA API和正则表达式的多分资料也没找到解释,希望有高手能够给个解答。
反匹配?!
(?!xxxxx)所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。
实际测试中发现?!就是?=的反操作,就不再将运行结果拷贝上来了。
反向预搜索(?<=)
(?<=xxxxx)在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的左侧 ,必须能够匹配上 xxxxx 这部分的表达式。
运行测试语句后得到的结果就很奇怪了。测试JAVA代码如下:
String testStr1="Windows_XP";
String testStr2="XP10aaaaaa_XP20Windows_XP30A";
String pattern="(.*?)(?<=XP)";
String pattern2="(.*?)(?<=(XP)+)";
System.out.println(testStr1.replaceAll(pattern, ""));
System.out.println(testStr2.replaceAll(pattern, ""));
System.out.println(testStr1.replaceAll(pattern2, ""));
System.out.println(testStr2.replaceAll(pattern2, ""));
打印结果如下:
1230A
P
P1P2P30A
反匹配?<!是?<=的取反操作。