我想使用正则表达式匹配一个模式,但我需要一些例外来匹配。例如,匹配“John Doe”的所有出现,除了那些“John Doe”被粗体标签括起来的出现,即“ <b>
John Doe </b>
”。
Match: John Doe
Don't match: <b>John Doe</b>
如何使用正则表达式实现这一点?
澄清:我想排除粗体标签之间的所有内容。此排除的内容可能包含多种字符、换行符等。
我想使用正则表达式匹配一个模式,但我需要一些例外来匹配。例如,匹配“John Doe”的所有出现,除了那些“John Doe”被粗体标签括起来的出现,即“ <b>
John Doe </b>
”。
Match: John Doe
Don't match: <b>John Doe</b>
如何使用正则表达式实现这一点?
澄清:我想排除粗体标签之间的所有内容。此排除的内容可能包含多种字符、换行符等。
如果您的正则表达式方言允许环视,您可以使用否定的lookbehind和否定的lookahead来完成该任务:
(?<!<b>)John Doe(?!<b>)
使用 Perl,您可以使用否定的lookbehind:
$ echo "<b>John Doe</b>" | perl -ne 'print if /(?<!<b>)John Doe/'
(上面没有打印 - 不匹配)。
$ echo "John Doe" | perl -ne 'print if /(?<!<b>)John Doe/'
John Doe
(以上匹配)。
Symbol(?<!<b>)
是一个否定的lookbehind - 如果它后面没有跟它里面的内容(<b>
在这种情况下),则字符串匹配。
您可以为此使用负面的环顾四周:
(?<!<b>)John Doe(?!</b>)
那不匹配<b>John Doe
,或者John Doe</b>
两者都不匹配。
如果您只想不将实例与开始和结束标签匹配,您可以执行以下操作:
John Doe(?!(?<=<b>John Doe)</b>)
或者稍短一些(但不太容易理解 - 8 是 的长度John Doe
):
John Doe(?!(?<=<b>.{8})</b>)