Что такое регулярное выражение "независимая группа захвата"?

Из документации по шаблону Java 6:

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

(?:Икс) X, как не захватывающая группа

...

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

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

4 ответа

Решение

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

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

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

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

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

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

(?>X[?/*/+]) такой же как (?:X)[?/*/+]+,

Другие вопросы по тегам