[英]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.