2015-09-21 226 views
0

我只是用正则表达式查询并且有一个问题。正则表达式不贪婪行为

模式:

param(.*?(\d*))(.*?), 

字符串:

"param":123432412341, 

为什么是第三组的明确文本匹配后追赶串的全部?看起来\d*在这种情况下表现得很懒,第一个.*?什么也没有匹配,\d*什么都没匹配。

+0

作为一个方面说明,我从来不使用嵌套捕获组。如果我需要(替换,即'foo(ba(?:r | z))'),我使用一个非捕获组。 – Sam

+0

在这样的问题中,确定你期望的内容会很有帮助,例如“我期望第二组捕获所有数字”)。 – Les

回答

3

您将通过更改\d* to \d+来获得预期结果。这是因为一旦下一条表达式匹配,一个惰性匹配(.*?)就会停止。这个懒惰匹配从参数"开始,然后检查\d*是否匹配(它确实 - 在该位置有0+个数字),然后继续并匹配(.*?),。当您将其切换到\d+时,"不再匹配,并且第一个懒点匹配全部继续吃掉字符,直到第一个数字(如预期的)。

解决它的另一种方法将是removing the second .*?(可能它不需要,因为整数在它和逗号之间不会有任何非数字字符)。这是有效的,因为在\d*匹配"(如前所述)之后,逗号将无法匹配,并且懒惰点匹配全部将继续匹配字符,直到有0+数字后跟逗号。

另请注意,有时(如果您的表达式可能足够具体),懒点匹配 - 全部效率不如使用否定字符类效率。写这个的另一种方法是使用\D* ([^\d]) instead of .*?。这匹配12个步骤,而不是45(原始正则表达式),21(使用\d+)和24(删除第二个.*?)。

+1

也许我有点不清楚,但这正是我所问的。感谢您的明确解释。 – cubesnyc