1

例子:

a = "abcab"

/c??ab/.match(a) # Matches "ab", as I expected
/c?ab/.match(a)  # Still matches "ab"

据我了解,因为?单独的字符是贪婪的,它应该首先尝试匹配可能的最大字符串 - cab -,但这不是我在 Ruby 1.9 中得到的行为。

预期的行为是什么,为什么?

4

1 回答 1

1

正则表达式作为一个整体是急切的——它会在第一时间尝试匹配。所以c?abc??ab是等价的:唯一的区别是他们喜欢匹配多长的子字符串,而他们实际上并没有机会行使这种偏好。


对此进行一点扩展。. . 考虑一下:

/<.*>/.match("abcde<fghi>jkl<mn>o")

它将从第一个开始匹配<,并且因为它是贪婪的,它会在仍然匹配的同时尝试尽可能多的匹配,这意味着它会匹配<fghi>jkl<mn>。如果您更改为非贪婪量词:

/<.*?>/.match("abcde<fghi>jkl<mn>o")

它仍然会从第一个开始匹配<,但现在会在仍然匹配的同时尝试尽可能少地匹配,这意味着它只会匹配<fghi>. 但它不会尝试跳过<mn>并匹配它,即使这是一个较短的子字符串。它匹配的唯一方法<mn>是,如果它之前完全没有匹配到任何地方。

于 2013-07-15T01:06:39.933 回答