我正在尝试运行以下搜索(使用。通过在perl中添加/s标志或在vim中将其替换为\_.
来匹配换行符):
/<output_channels>.*(?=Story).*?<\/output_channels>/
但是呢?没有像往常那样关闭贪婪--有人能解释为什么吗?例如,它匹配以下文件的全部内容,而不仅仅是第一个元素:
<output_channels>
<output_channel>RSS</output_channel>
<output_channel>Story</output_channel>
</output_channels>
<output_channels>
<output_channel>RSS</output_channel>
</output_channels>
如果我遗漏了一些明显的东西,很抱歉。
发布于 2011-04-15 10:16:28
我将您的示例文本放入vim缓冲区,然后执行命令
:%!perl -e '$text = join("", <STDIN>); $text =~ /<output_channels>.*(?=Story).*?<\/output_channels>/s; print $&;'
结果就是XML的第一个块。我想这就是你想要的?
注意,我在正则表达式中对/
进行了转义。除此之外,这和你的问题中给出的是一样的。
另请注意,等效的vim RE将是(测试,工作):
<output_channels>\_.*\(story\)\@=\_.\{-}<\/output_channels>
有关perl和vim REs之间差异的简要介绍,请参阅:help perl-patterns
。
进一步注意,parsing heirarchical markup with regexps has been known to reawaken ancient demons。
发布于 2011-04-15 10:02:54
正则表达式中的第一个.*
仍然是贪婪的。您只在第二个之后添加了?
。
https://stackoverflow.com/questions/5675062
复制相似问题