正则表达式在标签中找到没有特定短语的HTML元素

时间:2011-05-05 14:27:24

标签: regex vim

我需要在开头<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>

3 个答案:

答案 0 :(得分:2)

这可能需要进行一些调整,具体取决于整个XML文件的外观,但它适用于您的示例:

<output_channels>(?:\s*<output_channel>(?!Story)[^<]+<\/output_channel>\s*)+<\/output_channels>

答案 1 :(得分:2)

答案 2 :(得分:1)

你需要摆脱第一个.*?。发生了什么事情,在((?!Story).)*?部分正确无法匹配其中Story的内容后,正则表达式引擎会回溯并给.*?一个裂缝,当然它会成功。当然,假设您在/s(单行或点匹配全部)模式下进行匹配。