什么是用利润/.*?/(What's the profit of using /.*?/)

2019-08-02 18:54发布

在一些Rails代码(黄瓜特征的步骤的定义,Javascript角, rails_admin宝石)我发现这个正则表达式部分:

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

我有在正则表达式的一些知识,我知道*? 符号是类似的,但同时星号表示zero and more ,问号装置could be present or could be not

因此,使用问号附近的符号组使得它的存在范围内的短语被测试非必需的 。 什么是使用它的非必需已经接近组的......好招(跳过要求使用星号AFAIK制造)?

Answer 1:

一个量词(如后右* ),则? 具有不同的含义,并使其“ungreedy”。 因此,虽然默认是*消耗尽可能, *? 尽量少匹配。

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

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

没有问号的正则表达式完整的字符串匹配(因为.*可以消耗"就像别的)和some string" or "another被捕获。通过使用问号,比赛将尽快停止,(所以以后...some string" ),将只捕获some string

进一步阅读。



Answer 2:

? 具有双重意义。

/foo?/

意味着上次o可以有0或者1次。

/foo*?/ 

意味着上次o将在那里零次或多次,但选择最小数量,即,它的非贪婪。

这可能有助于解释:

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

non-greedy使用的? 不幸的是,我认为。 他们重复使用的运营商,我们预计将有一个意思是“零或一”并在某种程度上能够真正难以破译扔向我们。

但是,需要是真实的:太多的时候,我们会写会去完全错误,吞噬一切看到的东西,因为正则表达式引擎在做什么,我们无法预料的字符图案表示的模式。 正则表达式可以很复杂,令人费解,但“非贪婪”的使用? 帮助驯服这一点。 有时,使用它是出了马虎或快速正肮脏的方式,但我们没有时间重写模式做是正确的。 有时它的灵丹妙药,是优雅。 我认为这是取决于你是否是一个最后期限,并编写代码完成某件事,或者你在事后调试多年,终于发现? 是不是最佳的修复。



Answer 3:

这使得搜索非贪婪 。 这意味着,它将满足于最短的匹配,而不是最长的。



Answer 4:

考虑这个字符串

"<person>1</person><person>2</person>"

正则表达式

<person>.*</person>将匹配<person>1</person><person>2</person>

因此, .*贪婪的 ..

正则表达式

<person>.*?</person>将匹配<person>1</person><person>2</person>在下一比赛

因此, .*? ..



文章来源: What's the profit of using /.*?/