简单的正则表达式模式混乱

时间:2017-08-18 14:47:00

标签: php regex

请有人帮我一把。为什么我得到以下输出

$pattern = "#([a-z])*|(chol)#";
preg_match($pattern, 'chol',$m);

print_r($m) // array
                (
                  [0]=> 'chol',
                  [1]=> 'l'
                )

为什么匹配的第一个子捕获只有l个字符,而完全匹配为chol。可能是我错过了什么。 我期望这个输出低于

array
        (
         [0]=> 'chol',
         [1]=> 'chol'
        )

我不认为这种模式让我感到困惑太复杂了。

1 个答案:

答案 0 :(得分:3)

您量化了一个群体。您需要量化[a-z]字符类。

使用

$pattern = "#([a-z]*)|(chol)#";

PHP demo查看Repeating a Capturing Group vs. Capturing a Repeated Group及更多详情。简而言之:([a-z]*)将匹配并捕获0个或更多个小写ASCII字母到组1中,它将包含这些字母的整个块,而([a-z])*将匹配并捕获0个或更多个后续小写字母的出现ASCII字母,同时用新的字母覆盖每个先前的事件。

如果您不使用冗余捕获组,也可以考虑删除它们。

更多信息,因为这是一个非锚定的替换,请注意[a-z]*将始终匹配chol,第二个替代将永远不会匹配。您可以考虑将(chol)作为第一个替换,因为更具体

所以,我建议

$pattern = "#(chol)|([a-z]*)#";

有关Remember That The Regex Engine Is Eager的详情。