【问题标题】:How do I create a multiline regex?如何创建多行正则表达式?
【发布时间】:2013-03-06 04:55:08
【问题描述】:

我正在尝试匹配块中的所有文本:

group :development do
  gem 'test'
end

在上面的上下文中,我想返回"gem 'test'"。 我使用的是:

/(?<=group :development do)(.*)(?=end)/m

为什么它不起作用?

【问题讨论】:

标签: ruby regex


【解决方案1】:

我不确定为什么,但是将 .* 更改为 .*? 可以匹配。

Rubular:http://www.rubular.com/r/GaQj6cM0rk

它似乎也应该与.* 匹配得很好,但由于某种原因它似乎没有回溯。

当使用.* 时,这里是Rubular:http://www.rubular.com/r/jKf0bDZi7T

请注意,无论发生这种行为的原因是什么,您都应该使用.*?,否则您只会找到从第一个块的开头到最后一个块的结尾的单个匹配项(如果有多个块在一个字符串中)。

【讨论】:

  • .* 搜索最长的匹配项。 .*? 搜索尽可能短的,在大多数情况下更可取。
  • 这是因为.*是一个“贪婪匹配”,它尽可能匹配,在这种情况下也吃掉end,而.*?是一个非贪婪匹配并且只会吃到足以让正则表达式的其余部分匹配。
  • 对于上面的 cmets,.* 在这个例子中也应该匹配。见regexr.com?34100。即使.* 会吃掉end,正则表达式引擎也应该回溯直到匹配成功。
  • 我刚刚尝试使用/(?&lt;=f).*//(?&lt;=fo).*/ 来重现此内容以匹配foo - 后者在Rubular 中失败,当我在Rubular 中重新打开页面时,o已经自发地变成了0!!我将进一步调查。
  • @TimPietzcker 让我更新!我真的很好奇这种行为。
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多