在一些Rails代码(黄瓜特征的步骤的定义,Javascript角, rails_admin
宝石)我发现这个正则表达式部分:
string =~ /some regexp.+rules should match "(.*?)"/i
我有在正则表达式的一些知识,我知道*
和?
符号是类似的,但同时星号表示zero and more
,问号装置could be present or could be not
。
因此,使用问号附近的符号组使得它的存在范围内的短语被测试非必需的 。 什么是使用它的非必需已经接近组的......好招(跳过要求使用星号AFAIK制造)?
一个量词(如后右*
),则?
具有不同的含义,并使其“ungreedy”。 因此,虽然默认是*
消耗尽可能, *?
尽量少匹配。
在特定情况下,这是相关的像这样的字符串:
some regexp rules should match "some string" or "another"
没有问号的正则表达式完整的字符串匹配(因为.*
可以消耗"
就像别的)和some string" or "another
被捕获。通过使用问号,比赛将尽快停止,(所以以后...some string"
),将只捕获some string
。
进一步阅读。
?
具有双重意义。
/foo?/
意味着上次o
可以有0或者1次。
/foo*?/
意味着上次o
将在那里零次或多次,但选择最小数量,即,它的非贪婪。
这可能有助于解释:
'foo'[/foo?/] # => "foo"
'fo'[/foo?/] # => "fo"
'fo'[/foo*?/] # => "fo"
'foo'[/foo*?/] # => "fo"
'fooo'[/foo*?/] # => "fo"
在non-greedy
使用的?
不幸的是,我认为。 他们重复使用的运营商,我们预计将有一个意思是“零或一”并在某种程度上能够真正难以破译扔向我们。
但是,需要是真实的:太多的时候,我们会写会去完全错误,吞噬一切看到的东西,因为正则表达式引擎在做什么,我们无法预料的字符图案表示的模式。 正则表达式可以很复杂,令人费解,但“非贪婪”的使用?
帮助驯服这一点。 有时,使用它是出了马虎或快速正肮脏的方式,但我们没有时间重写模式做是正确的。 有时它的灵丹妙药,是优雅。 我认为这是取决于你是否是一个最后期限,并编写代码完成某件事,或者你在事后调试多年,终于发现?
是不是最佳的修复。
这使得搜索非贪婪 。 这意味着,它将满足于最短的匹配,而不是最长的。
考虑这个字符串
"<person>1</person><person>2</person>"
正则表达式
<person>.*</person>
将匹配<person>1</person><person>2</person>
因此, .*
是贪婪的 ..
正则表达式
<person>.*?</person>
将匹配<person>1</person>
和<person>2</person>
在下一比赛
因此, .*?
懒 ..