4.1.4 不包含验证(2)

来源:互联网 发布:知敬畏的含义 编辑:程序博客网 时间:2024/04/30 17:01

 当英文单词的结尾为字母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)。