Regular Expressions
Атомная группировка
Поиск…
Вступление
Регулярные группы без захвата позволяют двигателю повторно вводить группу и пытаться сопоставить что-то другое (например, различное чередование или меньше символов, когда используется квантификатор).
Атомные группы отличаются от регулярных не-захватных групп тем, что откат запрещен. Как только группа выйдет, вся информация об отступлении отбрасывается, поэтому никаких альтернативных совпадений не может быть предпринята.
замечания
Притяжательный квантификатор ведет себя как атомная группа в том, что движок не сможет вернуться к токену или группе.
Следующие эквиваленты с точки зрения функциональности, хотя некоторые из них будут быстрее других:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Группировка с (?>)
Использование атомной группы
Атомные группы имеют формат (?>...)
с ?>
После открытого пара.
Рассмотрим следующий образец текста:
ABC
Регулярное выражение будет пытаться сопоставить начало в позиции 0 текста, который находится перед A
в ABC
.
Если бы использовалось нечувствительное к регистру выражение (?>a*)abc
A
(?>a*)abc
, то (?>a*)
A
(?>a*)
бы символу 1 A
, оставив
BC
как оставшийся текст для соответствия. Группа (?>a*)
A (?>a*)
завершается, а abc
пытается (?>a*)
оставшийся текст, который не соответствует.
Двигатель не может возвратиться в атомную группу, и поэтому текущий проход терпит неудачу. Двигатель переместится в следующую позицию в тексте, который будет находиться в позиции 1, которая находится после A
и перед B
из ABC
.
Повторное выражение (?>a*)abc
A
(?>a*)abc
снова выполняется, и (?>a*)
A
(?>a*)
соответствует A
0 раз, оставляя
BC
как оставшийся текст для соответствия. Вызывается группа (?>a*)
A (?>a*)
и предпринимается попытка abc
, которая терпит неудачу.
Опять же, двигатель не может вернуться в атомную группу, и поэтому текущий проход терпит неудачу. Регулярное выражение будет продолжать сбой, пока все позиции в тексте не будут исчерпаны.
Использование неатомной группы
Регулярные группы, не участвующие в захвате, имеют формат (?:...)
с ?:
После открытого пара.
При использовании одного и того же текста примера, но вместо выражения с нечувствительным к регистру (?:a*)abc
будет происходить совпадение, так как может произойти обратное отслеживание.
Сначала (?:a*)
A
(?:a*)
будет использовать букву A
в тексте
ABC
уход
BC
как оставшийся текст для соответствия. Группа (?:a*)
A (?:a*)
завершается, а abc
пытается (?:a*)
оставшийся текст, который не соответствует.
Двигатель возвращается в группу (?:a*)
A
(?:a*)
и пытается совместить 1 меньшее число символов: вместо сопоставления 1 символа A
он пытается совместить символы 0 A
, и группа (?:a*)
A
(?:a*)
завершается. Это оставляет
ABC
как оставшийся текст для соответствия. Регулярное выражение abc
теперь может успешно сопоставлять оставшийся текст.
Другой пример текста
Рассмотрим этот образец текста как с атомными, так и с неатомными группами (опять же, без учета регистра):
AAAABC
Регулярное выражение будет пытаться сопоставить начало в позиции 0 текста, которое находится перед первым A
в AAAABC
.
Образец, использующий атомную группу (?>a*)abc
A
(?>a*)abc
, не сможет сравниться, ведя почти одинаково с приведенным выше примером атомной ABC
: все 4 из символов A
сначала сопоставляются с (?>a*)
A
(?>a*)
(оставляя BC
как оставшийся текст соответствует), а abc
не может соответствовать этому тексту. Группа не может быть повторно введена, поэтому совпадение не выполняется.
Образец, использующий неатомную группу (?:a*)abc
A
(?:a*)abc
, сможет сопоставляться, действуя аналогично приведенному выше ABC
примеру ABC
: все 4 из символов A
сначала сопоставляются с (?:a*)
A
(?:a*)
(оставляя BC
поскольку оставшийся текст соответствует), и abc
не может соответствовать этому тексту. Группа может быть повторно введено, так один меньше попытка: 3 A
A
символы совпадают вместо 4 (оставляя ABC
как остальной текст , чтобы соответствовать), и abc
способны успешно соответствовать по этому тексту.