正则表达式-如何控制括号是标记子组还是执行其他操作(PHP-preg_match)


Regular expressions - How to control whether parenthesis mark a sub group or do something else (PHP - preg_match)

如何控制正则表达式中的括号是标记子组、执行其他操作,还是两者兼有?

例如,如果我有诸如"AA12345"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"answers"queen",编号为1和2。