Поиск…


Вступление

Регулярные группы без захвата позволяют двигателю повторно вводить группу и пытаться сопоставить что-то другое (например, различное чередование или меньше символов, когда используется квантификатор).

Атомные группы отличаются от регулярных не-захватных групп тем, что откат запрещен. Как только группа выйдет, вся информация об отступлении отбрасывается, поэтому никаких альтернативных совпадений не может быть предпринята.

замечания

Притяжательный квантификатор ведет себя как атомная группа в том, что движок не сможет вернуться к токену или группе.

Следующие эквиваленты с точки зрения функциональности, хотя некоторые из них будут быстрее других:

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 способны успешно соответствовать по этому тексту.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow