我只是用正则表达式查询并且有一个问题。正则表达式不贪婪行为
模式:
param(.*?(\d*))(.*?),
字符串:
"param":123432412341,
为什么是第三组的明确文本匹配后追赶串的全部?看起来\d*
在这种情况下表现得很懒,第一个.*?
什么也没有匹配,\d*
什么都没匹配。
我只是用正则表达式查询并且有一个问题。正则表达式不贪婪行为
模式:
param(.*?(\d*))(.*?),
字符串:
"param":123432412341,
为什么是第三组的明确文本匹配后追赶串的全部?看起来\d*
在这种情况下表现得很懒,第一个.*?
什么也没有匹配,\d*
什么都没匹配。
您将通过更改\d*
to \d+
来获得预期结果。这是因为一旦下一条表达式匹配,一个惰性匹配(.*?
)就会停止。这个懒惰匹配从参数"
开始,然后检查\d*
是否匹配(它确实 - 在该位置有0+个数字),然后继续并匹配(.*?),
。当您将其切换到\d+
时,"
不再匹配,并且第一个懒点匹配全部继续吃掉字符,直到第一个数字(如预期的)。
解决它的另一种方法将是removing the second .*?
(可能它不需要,因为整数在它和逗号之间不会有任何非数字字符)。这是有效的,因为在\d*
匹配"
(如前所述)之后,逗号将无法匹配,并且懒惰点匹配全部将继续匹配字符,直到有0+数字后跟逗号。
另请注意,有时(如果您的表达式可能足够具体),懒点匹配 - 全部效率不如使用否定字符类效率。写这个的另一种方法是使用\D*
([^\d]
) instead of .*?
。这匹配12个步骤,而不是45(原始正则表达式),21(使用\d+
)和24(删除第二个.*?
)。
也许我有点不清楚,但这正是我所问的。感谢您的明确解释。 – cubesnyc
作为一个方面说明,我从来不使用嵌套捕获组。如果我需要(替换,即'foo(ba(?:r | z))'),我使用一个非捕获组。 – Sam
在这样的问题中,确定你期望的内容会很有帮助,例如“我期望第二组捕获所有数字”)。 – Les