Java Language Utilizzo dei gruppi di cattura

Esempio

Se è necessario estrarre una parte di stringa dalla stringa di input, possiamo usare i gruppi di cattura di regex.

Per questo esempio, inizieremo con un semplice numero di telefono regex:

\d{3}-\d{3}-\d{4}

Se le parentesi sono aggiunte alla regex, ciascuna serie di parentesi viene considerata un gruppo di cattura . In questo caso, stiamo usando quelli che sono chiamati gruppi di cattura numerati:

(\d{3})-(\d{3})-(\d{4})
^-----^ ^-----^ ^-----^
Group 1 Group 2 Group 3

Prima di poterlo utilizzare in Java, non dobbiamo dimenticare di seguire le regole di Stringhe, sfuggire alle barre inverse, con il seguente schema:

"(\\d{3})-(\\d{3})-(\\d{4})"

Per prima cosa dobbiamo compilare il modello regex per creare un Pattern e quindi abbiamo bisogno di un Matcher per abbinare la nostra stringa di input con il pattern:

Pattern phonePattern = Pattern.compile("(\\d{3})-(\\d{3})-(\\d{4})");
Matcher phoneMatcher = phonePattern.matcher("abcd800-555-1234wxyz");

Successivamente, il Matcher deve trovare la prima sottosequenza che corrisponde alla regex:

phoneMatcher.find();

Ora, usando il metodo di gruppo, possiamo estrarre i dati dalla stringa:

String number = phoneMatcher.group(0); //"800-555-1234" (Group 0 is everything the regex matched)
String aCode = phoneMatcher.group(1); //"800"
String threeDigit = phoneMatcher.group(2); //"555"
String fourDigit = phoneMatcher.group(3); //"1234"

Nota: Matcher.group() può essere utilizzato al posto di Matcher.group(0) .

Java SE 7

Java 7 ha introdotto i gruppi di acquisizione denominati. I gruppi di cattura con nome funzionano allo stesso modo dei gruppi di cattura numerati (ma con un nome anziché un numero), sebbene vi siano lievi modifiche alla sintassi. L'utilizzo dei gruppi di acquisizione con nome migliora la leggibilità.

Possiamo modificare il codice precedente per utilizzare i gruppi denominati:

(?<AreaCode>\d{3})-(\d{3})-(\d{4})
^----------------^ ^-----^ ^-----^
AreaCode           Group 2 Group 3

Per ottenere il contenuto di "AreaCode", possiamo invece utilizzare:

String aCode = phoneMatcher.group("AreaCode"); //"800"