4.1.4 不包含验证(2)

本文探讨了正则表达式的特定应用场景,特别是在匹配英文单词时如何排除特定字母的问题。通过引入零宽度负预测先行断言,解决了传统表达式的局限性,并对比了几种不同正则表达式的匹配效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 当英文单词的结尾为字母B时,正则表达式/b[A-Z]*B[^P][A-Z]*/b将匹配失败。原因如下:

      表达式[^P]总是要匹配一个字符;

      当英文单词的结尾为字母B时,[^P]将会匹配该英文单词之后的分割符,如空格、句号等。

  为了解决上述问题,可以使用零宽度负预测先行断言(?!experssion)。它能够断言自身位置的后面不能匹配字符串experssion。以下正则表达式都能够简单验证字母B之后不能为字母P的任意英文单词。

/b[A-Z]*B(?!P)[A-Z]*/b                                                     (37)

/b[A-Z]{0,}B(?!P)[A-Z]{0,}/b                                                   (38)

  正则表达式(37)解释:

      /b匹配英文单词的边界,即英文单词的开始位置或结束位置。

      [A-Z]*可以匹配空字符串,或者匹配最小长度为1的、由大写英文字母组成的字符串。

      B匹配字母B

      (?!P)能够断言字母B之后不能为字母P

  使用工具Regex Tester分别测试正则表达式(37)和(38),结果分别如图(37)和(38)所示。

                                         

 

 

 

             

 

 

注意:正则表达式/b[A-Z]*B[^P][A-Z]*/b/b[A-Z]{0,}B[^P][A-Z]{0,}/b/b[A-Z]*B(?!P)[A-Z]*/b/b[A-Z]{0,}B(?!P)[A-Z]{0,}/b都不能精确匹配字母B之后不能为字母P类型的英文单词。

其中,正则表达式/b[A-Z]*B[^P][A-Z]*/b/b[A-Z]{0,}B[^P][A-Z]{0,}/b除了匹配字母B之后不能为字母    P类型的英文单词之外,还能够匹配以下2种情况。

1)英文单词中包含多个字母B。此时,上述正则表达式可以匹配字母B之后是字母P的英文单词;

2)英文单词字母B之后的字符不是字母,如字符/、数字等。此时,上述正则表达式可以匹配不是一个英文单词的字符串。

其中,正则表达式/b[A-Z]*B(?!P)[A-Z]*/b/b[A-Z]{0,}B(?!P)[A-Z]{0,}/b除了匹配字母B之后不能为字  母P类型的英文单词之外,还能够匹配上述的第一种情况。

使用工具Regex Tester对上述两种情况进行了测试,结果分别如图(1)和(2)所示。其中,测试的正则表达式(37)。

       

 

 

 

 

 

        

 

   

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值