JAVA中的正则表达式应用

 正则表达式中有几个规则在一般情况下很少用到,今天有时间就在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

 

 

反匹配?<!是?<=的取反操作。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值