如何控制正则表达式中的括号是否标记子组,执行其他操作或两者都有?
例如,如果我有“AA12345”和“AB12345”这样的字符串,我想preg_match为前两个字母,它们总是AA或AB,我有:
preg_match('/(A(A|B)).*/',$string,$matches);
(为了这个问题我放了。*因为字符串的其余部分不相关)
使用此设置,假设$ string =“AA12345”,我得到$ matches =
Array
(
[0] => AA12345
[1] => AA
[2] => A
)
我不需要或想要“[2] => A”作为结果,但是我无法从正则表达式中删除括号,因为OR运算符需要它们。我该如何处理?只是忽略结果,还是有更好的方法?
答案 0 :(得分:4)
您可以使用(?:...)
形式的“非捕获组”:
preg_match('/(A(?:A|B)).*/',$string,$matches);
正如the documentation所说:
如果左括号后跟“?:”,则子模式不执行任何捕获,并且在计算任何后续捕获子模式的数量时不计算。例如,如果字符串“白皇后”与模式匹配((?:red | white)(king | queen))捕获的子串是“白皇后”和“女王” ,编号为1和2.