Cattura e raggruppamento
L'acquisizione del gruppo (pattern) crea un gruppo con proprietà di acquisizione .
Uno correlato che potresti vedere (e utilizzare) spesso è (?:pattern), che crea un gruppo senza acquisire proprietà, quindi denominato gruppo non di acquisizione .
Un gruppo viene solitamente utilizzato quando è necessario ripetere una sequenza di modelli, ad esempio (\.\w+)+, o per specificare dove deve avere effetto l'alternanza, ad esempio ^(0*1|1*0)$( ^, then 0*1or 1*0, then $) contro ^0*1|1*0$( ^0*1o 1*0$).
Un gruppo di acquisizione, oltre al raggruppamento, registrerà anche il testo corrispondente al modello all'interno del gruppo di acquisizione (pattern). Usando il tuo esempio, (.*):, .*le partite ABCe :le partite :, e dal momento che .*è dentro gruppo di cattura (.*), il testo ABCviene registrato per il gruppo di cattura 1.
Numero del gruppo
L'intero modello è definito come il numero di gruppo 0.
Qualsiasi gruppo di acquisizione nel modello inizia l'indicizzazione da 1. Gli indici sono definiti dall'ordine delle parentesi di apertura dei gruppi di acquisizione . Ad esempio, ecco tutti e 5 i gruppi di acquisizione nel modello seguente:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
I numeri di gruppo vengono utilizzati come riferimento \na ritroso nel modello e $nnella stringa di sostituzione.
In altre versioni regex (PCRE, Perl), possono essere utilizzate anche nelle chiamate di sub-routine .
È possibile accedere al testo abbinato da un determinato gruppo con Matcher.group(int group). I numeri di gruppo possono essere identificati con la regola sopra indicata.
In alcune versioni di espressioni regolari (PCRE, Perl), è presente una funzione di ripristino dei rami che consente di utilizzare lo stesso numero per acquisire gruppi in diversi rami di alternanza .
Nome del gruppo
Da Java 7, è possibile definire un gruppo di acquisizione denominato (?<name>pattern) e accedere al contenuto abbinato a Matcher.group(String name). La regex è più lunga, ma il codice è più significativo, poiché indica cosa stai cercando di abbinare o estrarre con la regex.
I nomi dei gruppi vengono utilizzati come riferimento \k<name>a ritroso nel modello e ${name}nella stringa di sostituzione.
I gruppi di acquisizione con nome sono ancora numerati con lo stesso schema di numerazione, quindi è possibile accedervi anche tramite Matcher.group(int group).
Internamente, l'implementazione di Java si limita a mappare dal nome al numero del gruppo. Pertanto, non è possibile utilizzare lo stesso nome per 2 diversi gruppi di acquisizione.