这种解释混合了两个不同的概念,IMO 应该保持分开
A) 回溯
在寻找匹配项时,量词 ( ?
, *
, +
) 的正常行为是“贪婪的”,即尽可能多地咀嚼......例如,在/(a+)([^b]+)/
测试中,aaaacccc
所有这些a
都将成为第 1 组的一部分,即使它们当然是还匹配字符集[^b]
(除 之外的所有内容b
)。
但是,如果抓取过多会阻止匹配,则 RE 规则要求量词“回溯”捕获更少,如果这允许表达式匹配。例如,在第 1 组(a+)([^b]+)
进行测试时,aaaa
只会得到 3 个a
s,留给第 2 组匹配。
您可以使用“非贪婪量词”(如*?
, +?
, )来改变这种贪婪行为??
。在这种情况下,引擎会进行回溯,但含义相反:非贪婪的子表达式将尽可能少地吃掉,以允许表达式的其余部分匹配。例如(a+)(a+b+)
,tested withaaabbb
将为组 1 和组 2 留下两个a
s abbb
,但(a+?)(a+b+)
使用相同的字符串将只a
为组 1 留下一个,因为这是允许匹配剩余部分的最小值。
请注意,由于回溯,如果表达式是否匹配,贪婪/非贪婪选项不会改变,而只会改变匹配的大小和每个子表达式的大小。
B)“全局”选项
这与回溯完全无关,只是意味着搜索必须找到所有不重叠的匹配,而不是在第一个匹配处停止。这是通过找到第一个匹配项,然后在匹配项结束后重新开始搜索来完成的。
请注意,每个匹配都是使用标准正则表达式规则计算的,并且不同匹配之间没有前瞻或回溯:换句话说,如果使例如贪婪匹配更短会在字符串中提供更多匹配,则不考虑此选项...即使指定了选项, a+[^b]+
tested withaaaaaa
也只会给出一个匹配g
项,即使子字符串aa
, aa
,aa
将是正则表达式的有效匹配项。