我需要在开头<output_channels>
和结束<output_channels>
标记之间匹配不包含短语“Story”的</output_channels>
个元素。 <output_channels>
元素永远不会嵌套,所以我认为我应该能够用正则表达式做到这一点 - 请不要回答它是不可能的,除非它真的是!
以下是我将使用perl或vim搜索的文本示例(我发现在vim中测试正则表达式更容易):
<output_channels>
<output_channel>RSS</output_channel>
<output_channel>Story</output_channel>
</output_channels>
<output_channels>
<output_channel>RSS</output_channel>
</output_channels>
我认为我需要运行类似以下的内容,但这会匹配<output_channels>
块:
<output_channels>.*?((?!Story).)*?<\/output_channels>
答案 0 :(得分:2)
这可能需要进行一些调整,具体取决于整个XML文件的外观,但它适用于您的示例:
<output_channels>(?:\s*<output_channel>(?!Story)[^<]+<\/output_channel>\s*)+<\/output_channels>
答案 1 :(得分:2)
答案 2 :(得分:1)
你需要摆脱第一个.*?
。发生了什么事情,在((?!Story).)*?
部分正确无法匹配其中Story
的内容后,正则表达式引擎会回溯并给.*?
一个裂缝,当然它会成功。当然,假设您在/s
(单行或点匹配全部)模式下进行匹配。