如何控制正则表达式中的括号是标记子组、执行其他操作,还是两者兼有?
例如,如果我有诸如"AA12345"one_answers"AB12345"之类的字符串,并且我想预匹配总是AA或AB的前两个字母,那么我有:
preg_match('/(A(A|B)).*/',$string,$matches);
(为了这个问题,我放了.*,因为字符串的其余部分不相关)
有了这个设置,假设$string="AA12345",我得到的是$matches=
Array
(
[0] => AA12345
[1] => AA
[2] => A
)
我不需要也不想要"[2]=>A"作为结果,但我不能从正则表达式中删除括号,因为or运算符需要它们。我该如何处理?忽略结果,或者有更好的方法吗?
您可以使用(?:...)
:形式的"非捕获组"
preg_match('/(A(?:A|B)).*/',$string,$matches);
正如文件所说:
如果左括号后面跟着"?:",则子模式不进行任何捕获,并且在计算任何后续捕获子模式的数量时不进行计数。例如,如果字符串"the white queen"与((?:red|white)(king|queen))模式匹配,则捕获的子字符串为"white queens"one_answers"queen",编号为1和2。