我有一个包含许多<request>
个元素的文件,并且我想查找不包含<request>
的所有<boop>
个标记。
<request>
在<boop>
之前和之后可以包含多个标记(例如下面示例中的<beep>
和<bop>
)。
<request>
<beep>
</beep>
<boop>
</boop>
<bop>
</bop>
</request>
我已尝试<request>.*?<\/request>
匹配每个<request>
凭借一种消极的向前看,我得到了:
<request>.*?(?!<boop>).*?<\/request>
但这似乎不起作用。
我的正则表达式和匹配用我的搜索选择的换行符。
提前谢谢。
答案 0 :(得分:1)
在Notepad ++中,您可以使用以下正则表达式授予您的<request>
标签无法嵌套:
(?s)<request>(?:(?!<(?:request|boop)>).)*?</request>
或者
<request>[^<]*(?:<(?!(?:request|boop)>)[^<]*)*</request>
查看online demo。
请注意,您无需担心这些模式的 .
匹配换行符选项。第二个与第一个相同,它是它的展开变体(它应该工作得更快,因为它不必测试每个char到</request>
结束分隔符的路径,它匹配整个文本块从<
到<
)。
<强>详情
(?s)
- 内联DOTALL修饰符(= .
匹配换行符 ON)<request>
- start delimiter (?:(?!<(?:request|boop)>).)*?
- 任何字符(.
),0 +重复(*
),尽可能少(?
,实际上,*?
量词)没有开始<request>
或<boop>
字符序列</request>
- 结束分隔符。