Захоплення та групування
Група захоплення (pattern) створює групу, яка має властивість захоплення .
Пов'язаний, який ви можете часто бачити (і використовувати), це те (?:pattern), що створює групу без захоплення властивостей, звідси і названа група, яка не захоплює .
Групу зазвичай використовують, коли потрібно повторити послідовність шаблонів, наприклад (\.\w+)+, або вказати, де чергування має набути чинності, наприклад ^(0*1|1*0)$( ^, тоді 0*1або 1*0, тоді $) проти ^0*1|1*0$( ^0*1або 1*0$).
Група захоплення, крім групування, також буде записувати текст, відповідний шаблону всередині групи захоплення (pattern). Використовуючи ваш приклад, (.*):, .*сірники ABCі :сірники :, і з тих пір .*знаходиться всередині захоплення групи (.*), текст ABCзаписується для захоплення 1 -й групи.
Номер групи
Весь зразок визначений як номер групи 0.
Будь-яка група захоплення у шаблоні починає індексувати з 1. Індекси визначаються у порядку відкриття дужок груп захоплення . Як приклад, ось усі 5 груп захоплення за схемою нижче:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
Номери груп використовуються для зворотного посилання \nв шаблоні та $nв рядку заміни.
В інших ароматах регулярного вираження (PCRE, Perl) вони також можуть бути використані в підпрограмних викликах .
Ви можете отримати доступ до тексту, який відповідає певній групі Matcher.group(int group). Номери груп можна ідентифікувати за правилом, зазначеним вище.
У деяких ароматах регулярного вираження (PCRE, Perl) є функція скидання гілки, яка дозволяє використовувати однакову кількість для захоплення груп у різних гілках чергування .
Назва групи
З Java 7 можна визначити названу групу захоплення (?<name>pattern) , і ви можете отримати доступ до вмісту, відповідного Matcher.group(String name). Регекс довший, але код є більш значимим, оскільки він вказує на те, що ви намагаєтеся зіставити або витягти з регулярним виразом.
Назви груп використовуються у зворотній посиланні \k<name>в шаблоні та ${name}в рядку заміни.
Іменовані групи захоплення все ще нумеруються з однаковою схемою нумерації, тому до них також можна отримати доступ через Matcher.group(int group).
Внутрішня реалізація Java просто відображає назву до номера групи. Тому ви не можете використовувати одне ім’я для двох різних груп захоплення.