如果在正则表达式中使用多个{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。
答案 0 :(得分:6)
我认为你方存在误解。完全没有使用正则表达式完全匹配两个量词的最小值。
正则表达式引擎首先尝试尽可能频繁地匹配第一个字符(默认情况下Quantifiers为greedy),因此如果至少有15个匹配[XYZ]{15,20}
则它看起来是另一个char,...,max直到它找到20,所以当它找到[XYZ]
的15到20之间,然后它继续检查其余的图案。
示例:
(X{15,20})(X{15,20})
和35" X"
的字符串XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
您将获得第一个 20 " X"在第一组,以及随后的15" X"在第二组。
答案 1 :(得分:0)
以下是正则表达式执行匹配的直观示例:
如您所见,正则表达式执行匹配从左到右。在使用许多复杂的替换时,例如(first|second|f1rst|s2cond)
。
因此,正则表达式引擎会在它移动到后面的字符类之前完全展开左{15,20}
。