繁体   English   中英

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

[英]simple regex pattern confusion

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

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

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

为什么匹配的第一个子捕获只有l字符,而完全匹配是chol 可能是我缺少了一些东西。 我期望下面的输出

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

我认为这种模式不会太复杂以至于使我感到困惑。

您量化了一个组。 您需要量化[az]字符类。

采用

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

有关重复捕获组与捕获重复组的更多信息,请参见PHP演示 简而言之: ([az]*)将匹配并将0个或多个小写ASCII字母捕获到组1中,并且将包含这些字母的整个块,而([az])*将匹配并捕获0个或多个小写的ASCII字母。随后的小写ASCII字母,同时用新的字母覆盖每个先前的字母。

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

另外,由于这是一个无固定的替代,因此请注意[az]*将始终与chol匹配,而第二个替代则将永远不匹配。 您可以考虑将(chol)作为第一种选择,因为它更具体

所以,我建议

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

有关此内容的更多信息, 请记住Regex引擎急切

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM