例子:
a = "abcab"
/c??ab/.match(a) # Matches "ab", as I expected
/c?ab/.match(a) # Still matches "ab"
据我了解,因为?
单独的字符是贪婪的,它应该首先尝试匹配可能的最大字符串 - cab -,但这不是我在 Ruby 1.9 中得到的行为。
预期的行为是什么,为什么?
正则表达式作为一个整体是急切的——它会在第一时间尝试匹配。所以c?ab
和c??ab
是等价的:唯一的区别是他们喜欢匹配多长的子字符串,而他们实际上并没有机会行使这种偏好。
对此进行一点扩展。. . 考虑一下:
/<.*>/.match("abcde<fghi>jkl<mn>o")
它将从第一个开始匹配<
,并且因为它是贪婪的,它会在仍然匹配的同时尝试尽可能多的匹配,这意味着它会匹配<fghi>jkl<mn>
。如果您更改为非贪婪量词:
/<.*?>/.match("abcde<fghi>jkl<mn>o")
它仍然会从第一个开始匹配<
,但现在会在仍然匹配的同时尝试尽可能少地匹配,这意味着它只会匹配<fghi>
. 但它不会尝试跳过<mn>
并匹配它,即使这是一个较短的子字符串。它匹配的唯一方法<mn>
是,如果它之前完全没有匹配到任何地方。