正则表达式 - 忽略与模式

时间:2017-01-05 11:17:44

标签: regex excel-vba vba excel

我有这个正则表达式:

\b[A-Z]{1}[A-Z]{0,7}[0-9]?\b|\b[0-9]{2,3}\b

所需输出突出显示:

约翰去了LONDON一个晴朗的日子。 约翰在PUB吃午饭。 约翰然后转移到CHICAGO。 我不希望突出显示JOHN。 约翰不希望这与模式匹配。 不是这个。 但是THIS1应该匹配模式。 也是模式应匹配的其他70次。

观察输出:

JOHN去了LONDON一个晴朗的日子。 JOHNPUB吃了午餐。 JOHN然后转移到CHICAGOI不希望突出显示JOHN。 约翰不希望这与模式匹配。 不是这个。 但是THIS1应该匹配模式。 也是模式应匹配的其他70次。

正则表达式部分工作,但我不希望两个常量字符串 - JOHNI匹配作为此正则表达式的一部分。请帮忙。

1 个答案:

答案 0 :(得分:7)

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

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

请参阅regex demo

如果匹配的字词等于(?!(?:JOHN|I)\b)I,则JOHN是未通过匹配的否定前瞻。

请注意,{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 - 尾随字边界