Что такое регулярное выражение "независимая группа захвата"?
из Java 6 Pattern документы:
специальные конструкции (без захвата)
(?:
X)
X, как группа без захвата...
(?>
X)
X, как независимая, не захватывающая группа
между (?:X)
и (?>X)
в чем разница? Что значит независимая значит в данном контексте?
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
не удается, механизм регулярных выражений не имеет альтернативы, чтобы попробовать.