Что такое регулярное выражение "независимая группа захвата"? - PullRequest
54 голосов
/ 08 сентября 2008

Из Java 6 Шаблон Документация:

Специальные конструкции (без захвата)

(?: X ) X как группа без захвата

...

(?> X ) X , как независимая группа без захвата

Между (?:X) и (?>X) в чем разница? Что означает независимый в этом контексте?

Ответы [ 4 ]

43 голосов
/ 09 сентября 2008

Это означает, что группировка атомная , и она отбрасывает информацию обратного отслеживания для соответствующей группы. Итак, это выражение притяжательное; он не отступит, даже если это единственный способ добиться успеха для регулярного выражения в целом. Он «независим» в том смысле, что он не взаимодействует с помощью обратного отслеживания с другими элементами регулярного выражения для обеспечения соответствия.

6 голосов
/ 27 декабря 2008

Если у вас есть foo(?>(co)*)co, это никогда не будет совпадать. Я уверен, что есть практические примеры, когда это было бы полезно, попробуйте книгу О'Рейли.

3 голосов
/ 03 мая 2018

Я думаю этот урок объясняет, что именно "независимая, не захватывающая группа" или "атомная группировка"

Регулярное выражение a(bc|b)c (группа захвата) соответствует abcc и abc . Регулярное выражение a(?>bc|b)c (атомная группа) соответствует abcc , но не abc .

При применении к abc оба регулярных выражения будут соответствовать a до a , bc до bc , а затем c не сможет совпадать в конце строки. Здесь их пути расходятся. Регулярное выражение с группой захвата запомнило позицию возврата для чередования. Группа откажется от своего матча, b затем совпадет с b и c совпадет с c . Совпадение найдено!

Регулярное выражение с атомной группой , однако, вышло из атомной группы после сопоставления bc. В этот момент все позиции возврата для жетонов внутри группы отбрасываются. В этом примере опция чередования попытаться b во второй позиции в строке отбрасывается. В результате при сбое c у механизма регулярных выражений не осталось альтернатив, чтобы попробовать.

0 голосов
/ 23 февраля 2015

(?>X[?/*/+]) совпадает с (?:X)[?/*/+]+.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...