regexp中的多个{min,max}个量词

时间:2014-04-30 08:42:37

标签: regex perl

如果在正则表达式中使用多个{min,max}量词,我发现并非所有组合都被使用。

/[XYZ]{15,20}[WXY]{15,20}/

我在11k字符的随机字符串上测试了它,但结果不符合我的预期:link

我认为第一对[XYZ] {15} [WXY] {15}被评估为TRUE,然后它跳转到下一个[XYZ] {15} [WXY] {16}。因此问题:

为什么perl采用第一种情况/[XYZ]{15}[WXY]{15}/,然后转移到/[XYZ]{16}[WXY]{15}/而不是/[XYZ]{15}[WXY]{16}/

我是否可以控制此行为,或者我需要继续并生成此类模式的所有组合并逐个搜索?

感谢您的任何建议。

PS。 这与我之前的帖子有点linked

2 个答案:

答案 0 :(得分:6)

我认为你方存在误解。完全没有使用正则表达式完全匹配两个量词的最小值。

正则表达式引擎首先尝试尽可能频繁地匹配第一个字符(默认情况下Quantifiersgreedy),因此如果至少有15个匹配[XYZ]{15,20}则它看起来是另一个char,...,max直到它找到20,所以当它找到[XYZ]的15到20之间,然后它继续检查其余的图案。

示例:

(X{15,20})(X{15,20})

和35" X"

的字符串
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

您将获得第一个 20 " X"在第一组,以及随后的15" X"在第二组。

See it on Regexr

答案 1 :(得分:0)

以下是正则表达式执行匹配的直观示例:

如您所见,正则表达式执行匹配从左到右。在使用许多复杂的替换时,例如(first|second|f1rst|s2cond)

,这一点尤为重要

因此,正则表达式引擎会在它移动到后面的字符类之前完全展开左{15,20}