0

我想使用正则表达式匹配一个模式,但我需要一些例外来匹配。例如,匹配“John Doe”的所有出现,除了那些“John Doe”被粗体标签括起来的出现,即“ <b>John Doe </b>”。

Match: John Doe
Don't match: <b>John Doe</b>

如何使用正则表达式实现这一点?

澄清:我想排除粗体标签之间的所有内容。此排除的内容可能包含多种字符、换行符等。

4

3 回答 3

1

如果您的正则表达式方言允许环视,您可以使用否定的lookbehind和否定的lookahead来完成该任务:

(?<!<b>)John Doe(?!<b>)
于 2013-03-15T14:46:51.237 回答
0

使用 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>在这种情况下),则字符串匹配。

于 2013-03-15T14:47:15.633 回答
0

您可以为此使用负面的环顾四周:

(?<!<b>)John Doe(?!</b>)

那不匹配<b>John Doe,或者John Doe</b>两者都不匹配。

如果您只想不将实例与开始和结束标签匹配,您可以执行以下操作:

John Doe(?!(?<=<b>John Doe)</b>)

或者稍短一些(但不太容易理解 - 8 是 的长度John Doe):

 John Doe(?!(?<=<b>.{8})</b>)
于 2013-03-15T14:47:28.817 回答