我有这个正则表达式:
\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
一个晴朗的日子。
JOHN
在PUB
吃了午餐。
JOHN
然后转移到CHICAGO
。
I
不希望突出显示JOHN
。
约翰不希望这与模式匹配。
不是这个。
但是THIS1
应该匹配模式。
也是模式应匹配的其他70
次。
正则表达式部分工作,但我不希望两个常量字符串 - JOHN
和I
匹配作为此正则表达式的一部分。请帮忙。
答案 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)
- 匹配的字词不能等于JOHN
或I
(?:[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
- 尾随字边界