如果我这样做在PHP中:
$str = "abc pqrs-1/2&3uvw xyz";
preg_match( "/([a-z]+)([^0-9a-z][0-9])+([a-z]+)/" , $str , $m );
将导致$m
比赛将是:
[0] => "pqrs-1/2&3uvw"
[1] => "pqrs"
[2] => "&3"
[3] => "uvw"
注意([^0-9a-z][0-9])+
部分,这是应该如何搭上“一个非字母数字字符,后面跟着买一个数字”一次或多次,有括号外的+
修改。
显然,主题字符串$str
包含此模式3场比赛:-1
和/2
和&3
但只记得最后一个。
有没有办法以某种方式一网打尽?
我曾尝试preg_match_all
代替preg_match
的,但如果整个正则表达式的目标字符串匹配中不止一次地只能找到多个匹配。
用语言表达我的正则表达式的含义:
因此,对于上面的例子字符串我希望得到的结果是这样的:
[0] => "pqrs-1/2&3uvw"
[1] => "pqrs"
[2] => [ "-1" , "/2" , "&3" ]
[3] => "uvw"
但无论我怎么努力,我不能让它也给-1
和/2
比赛吗?
你可以不匹配重复子反复捕获组。相反,你需要,使用一个两步走的方法做:
/([a-z]+)((?:[^0-9a-z][0-9])+)([a-z]+)/
相匹配,并与((?:[^0-9a-z][0-9])+)
捕捉(?:[^0-9a-z][0-9])
模式的所有重复preg_match_all
与组模式,'/[^0-9a-z][0-9]/'
。$str = "abc pqrs-1/2&3uvw xyz";
if (preg_match('~([a-z]+)((?:[^0-9a-z][0-9])+)([a-z]+)~', $str, $matches)) {
preg_match_all('~[^0-9a-z][0-9]~', $matches[2], $x);
$matches[2] = $x[0];
}
print_r($matches);
输出:
Array
(
[0] => pqrs-1/2&3uvw
[1] => pqrs
[2] => Array
(
[0] => -1
[1] => /2
[2] => &3
)
[3] => uvw
)