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


из Java 6 Pattern документы:

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

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

...

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

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

4 53

4 ответа:

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

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

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

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

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

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

(?>X[?/*/+]) Это то же самое, что (?:X)[?/*/+]+.