Что такое регулярное выражение "независимая группа захвата"?
Из документации по шаблону 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
, это никогда не будет совпадать. Я уверен, что есть практические примеры, когда это было бы полезно, попробуйте книгу О'Рейли.