正则表达式 - 忽略与模式匹配的常量字符串

Rac*_*cha 2 regex excel vba excel-vba

我有这个正则表达式:

\b[A-Z]{1}[A-Z]{0,7}[0-9]?\b|\b[0-9]{2,3}\b
Run Code Online (Sandbox Code Playgroud)

所述期望的输出是所强调:

约翰去了LONDON一个晴朗的日子.约翰吃过午饭PUB.约翰然后搬到了CHICAGO.我不想JOHN被强调.约翰不希望这与模式匹配.不是这个.但THIS1应该匹配模式.还有其他70时候模式应该匹配.

观察到的输出:

JOHN去了LONDON一个晴朗的日子. JOHN在一个午餐PUB. JOHN然后搬到了CHICAGO. I不想JOHN突出显示.约翰不希望这与模式匹配.不是这个.但THIS1应该匹配模式.还有其他70时候模式应该匹配.

正则表达式部分工作但我不想要两个常量字符串 - JOHN并且I作为此正则表达式的一部分匹配.请帮忙.

Wik*_*żew 7

您可以使用否定前瞻来排除这些匹配.此外,您的模式似乎相当"冗余",您可以使用分组并删除不必要的子模式来大大缩短它:

\b(?!(?:JOHN|I)\b)(?:[A-Z]{1,8}[0-9]?|[0-9]{2,3})\b
  ^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

(?!(?:JOHN|I)\b)是负先行失败比赛如果匹配字的长度等于IJOHN.

请注意,{1}总是可以省略,因为任何未量化的模式匹配一​​次.[A-Z]{1}[A-Z]{0,7}实际上等于[A-Z]{1,8}.

图案细节:

  • \b - 字边界
  • (?!(?:JOHN|I)\b)- 匹配的单词不能等于JOHNI
  • (?:[A-Z]{1,8}[0-9]?|[0-9]{2,3}) - 两种选择之一:
    • [A-Z]{1,8}[0-9]? - 1到8个大写ASCII字母,后跟可选(1或0)数字
    • | - 要么
    • [0-9]{2,3} - 2至3位数字
  • \b - 尾随字边界