使用/.*?/有什么好处

在一些Rails代码(黄瓜function的步骤定义,javascripts, rails_admin gem)中,我发现了这个正则表达式部分:

 string =~ /some regexp.+rules should match "(.*?)"/i 

我对正则表达式有一些了解,我知道*? 符号类似,但星号表示zero and more ,问号表示could be present or could be not

因此,使用符号组附近的问号使其在被测试的短语中不存在。 什么是……嗯…在非必需已经组附近使用它的技巧(跳过要求是使用星号afaik)?

在量词之后(如*? 具有不同的含义,使其“不合适”。 所以虽然默认值是*消耗尽可能多, *? 匹配尽可能少。

在您的特定情况下,这与这样的字符串相关:

 some regexp rules should match "some string" or "another" 

没有问号,正则表达式匹配完整的字符串(因为.*可以消耗"就像其他任何东西”)并且捕获some string" or "another 。使用问号,匹配将尽快停止,(所以...some string"之后...some string" )并将只捕获some string

进一步阅读。

? 有双重意义。

 /foo?/ 

意味着最后的o可以存在零次或一次。

 /foo*?/ 

意味着最后的o将会有零次或多次,但选择最小数量,即它是非贪婪的。

这些可能有助于解释:

 'foo'[/foo?/] # => "foo" 'fo'[/foo?/] # => "fo" 'fo'[/foo*?/] # => "fo" 'foo'[/foo*?/] # => "fo" 'fooo'[/foo*?/] # => "fo" 

non-greedy使用? 我觉得很不幸。 他们重新使用了一个我们希望有一个单一含义“零或一”的运算符,并以一种真正难以破译的方式将它扔给我们。

但是,需要是真实的:太多次,我们会编写一个会出现严重错误的模式,吞噬掉一切,因为正则表达式引擎正在按照我们所说的不可预见的字符模式进行操作。 正则表达式可以非常复杂和复杂,但“非贪婪”的使用? 帮助驯服。 有时,使用它是邋or或快速肮脏的出路,但我们没有时间重写模式来正确地做到这一点。 有时它是神奇的子弹,很优雅。 我认为这取决于你是否处于截止日期并编写代码来完成某项工作,或者你在事后几年调试并最终找到了? 不是最佳解决方案。

它使搜索非贪婪 。 这意味着,它将适应最短的比赛,而不是最长的比赛。

考虑这个字符串

"12"

正则表达式

.*将匹配12

所以, .*贪婪 ..

正则表达式

.*?将在下一场比赛中匹配12

那么, .*? 很懒 ..