首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >关闭贪婪在此正则表达式中不起作用

关闭贪婪在此正则表达式中不起作用
EN

Stack Overflow用户
提问于 2011-04-15 17:54:03
回答 2查看 316关注 0票数 3

我正在尝试运行以下搜索(使用。通过在perl中添加/s标志或在vim中将其替换为\_.来匹配换行符):

代码语言:javascript
代码运行次数:0
运行
复制
/<output_channels>.*(?=Story).*?<\/output_channels>/

但是呢?没有像往常那样关闭贪婪--有人能解释为什么吗?例如,它匹配以下文件的全部内容,而不仅仅是第一个元素:

代码语言:javascript
代码运行次数:0
运行
复制
<output_channels>
  <output_channel>RSS</output_channel>
  <output_channel>Story</output_channel> 
</output_channels>

<output_channels>
  <output_channel>RSS</output_channel>
</output_channels>

如果我遗漏了一些明显的东西,很抱歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-15 18:16:28

我将您的示例文本放入vim缓冲区,然后执行命令

代码语言:javascript
代码运行次数:0
运行
复制
:%!perl -e '$text = join("", <STDIN>); $text =~ /<output_channels>.*(?=Story).*?<\/output_channels>/s; print $&;'

结果就是XML的第一个块。我想这就是你想要的?

注意,我在正则表达式中对/进行了转义。除此之外,这和你的问题中给出的是一样的。

另请注意,等效的vim RE将是(测试,工作):

代码语言:javascript
代码运行次数:0
运行
复制
<output_channels>\_.*\(story\)\@=\_.\{-}<\/output_channels>

有关perl和vim REs之间差异的简要介绍,请参阅:help perl-patterns

进一步注意,parsing heirarchical markup with regexps has been known to reawaken ancient demons

票数 1
EN

Stack Overflow用户

发布于 2011-04-15 18:02:54

正则表达式中的第一个.*仍然是贪婪的。您只在第二个之后添加了?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5675062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档