Регулярные выражения - Как контролировать, отмечают ли скобки подгруппу или делают что-то еще (PHP - preg_match) - PullRequest
1 голос
/ 28 января 2012

Как мне контролировать, помечают ли скобки в моем регулярном выражении подгруппу, делают что-то еще или и то, и другое?

Например, если у меня есть строки, такие как «AA12345» и «AB12345», и я хочу preg_match для первых двух букв, которые всегда являются AA или AB, у меня есть:

preg_match('/(A(A|B)).*/',$string,$matches);

(я поставил. * Ради этого вопроса, потому что остальная часть строки не имеет значения)

С этой настройкой, предполагая, что $ string = "AA12345", я получаю $ match =

Array
(
[0] => AA12345
[1] => AA
[2] => A
)

Мне не нужно или не нужно получать «[2] => A» в результате, но я не могу удалить скобки из регулярного выражения, потому что они нужны для оператора OR. Как мне с этим бороться? Просто проигнорируйте результат, или есть лучший способ?

1 Ответ

4 голосов
/ 28 января 2012

Вы можете использовать «группу без захвата» в форме (?:...):

preg_match('/(A(?:A|B)).*/',$string,$matches);

Как документация выражает это:

Если за открывающей скобкой следует «?:», Подшаблон не выполняет захват и не учитывается при вычислении количества любых последующих поднаборов. Например, если строка «белая королева» сопоставляется с шаблоном the ((?: Red | white) (king | queen)) , то захваченными подстроками являются «белая королева» и «королева» и пронумерованы 1 и 2.

...