我有这个正则表达式:
\b[A-Z]{1}[A-Z]{0,7}[0-9]?\b|\b[0-9]{2,3}\b
所需的输出突出显示:
约翰在一个晴朗的日子去了伦敦
。
约翰在一家PUB
吃午餐。
约翰随后搬到了芝加哥。
我不想突出显示 JOHN
。
约翰不希望它与模式匹配。
这个也没有。
但 THIS1
应该与模式匹配。
还有模式应匹配的其他 70
次。
观察到的输出:
JOHN
在一个晴朗的日子去了伦敦
。
JOHN
在一家 PUB
吃午餐。
JOHN
随后搬到芝加哥
。
I
不想突出显示 JOHN
。
约翰不希望它与模式匹配。
这个也没有。
但 THIS1
应该与模式匹配。
还有模式应匹配的其他 70
次。
正则表达式可以部分工作,但我不希望两个常量字符串 - JOHN
和 I
作为此正则表达式的一部分进行匹配。请帮忙。
最佳答案
您可以使用否定前瞻来排除这些匹配项。另外,您的模式看起来相当“冗余”,您可以使用分组和删除不必要的子模式来大大缩短它:
\b(?!(?:JOHN|I)\b)(?:[A-Z]{1,8}[0-9]?|[0-9]{2,3})\b
^^^^^^^^^^^^^^^^
请参阅regex demo
(?!(?:JOHN|I)\b)
是否定先行,如果匹配的单词等于 I
或 ,则匹配失败>约翰
。
请注意,{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
- 尾随单词边界
关于正则表达式-忽略与模式匹配的常量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41483674/