匹配模式与异常

时间:2013-03-15 14:42:31

标签: regex

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

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

如何使用正则表达式实现此目的?

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

3 个答案:

答案 0 :(得分:1)

如果你的正则表达式方言允许外观,你可以使用负面的后观和负面的前瞻来完成这项任务:

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

答案 1 :(得分: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

(以上匹配)。

符号(?<!<b>)是一个负面的lookbehind - 字符串匹配,如果它没有跟在其中的内容(在这种情况下为<b>)。

答案 2 :(得分:0)

你可以使用负面的环顾:

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

但这与<b>John DoeJohn Doe</b>不匹配。

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

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

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

 John Doe(?!(?<=<b>.{8})</b>)