我想使用正则表达式匹配模式,但我需要一些匹配的例外。例如,匹配“John Doe”的每次出现,除了那些“John Doe”被粗体标记括起来的情况,即“<b>
John Doe </b>
”。
Match: John Doe
Don't match: <b>John Doe</b>
如何使用正则表达式实现此目的?
澄清:我想在粗体标记之间排除所有。此排除的内容可能包含各种字符,换行符等。
答案 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 Doe
或John Doe</b>
不匹配。
如果您只想将实例与开始和结束标记都不匹配,您可以执行以下操作:
John Doe(?!(?<=<b>John Doe)</b>)
或略短(但不太容易理解 - 8是John Doe
的长度):
John Doe(?!(?<=<b>.{8})</b>)