Matcher.find în Java

Expresii regulate (Pattern și Matcher) Java 1.4 (grupuri cu nume: Java 7)

find caută următoarea potrivire în text; group returnează textul găsit sau doar partea dintr-un grup (paranteze).

Sintaxă
boolean find()
String group()
String group(int numar)
String group(String nume)
int groupCount()

Ce face Matcher.find

find() caută următoarea bucată de text care se potrivește cu modelul, pornind de unde a rămas căutarea anterioară. Returnează true dacă a găsit ceva. Într-o buclă while (m.find()) parcurgi toate potrivirile.

group() (sau group(0)) returnează tot textul găsit. Parantezele din model formează grupuri, numerotate de la 1 de la stânga la dreapta: group(1), group(2). Grupurile pot avea și nume: (?<suma>\d+) se citește cu group("suma").

Un grup care nu a participat la potrivire (de exemplu unul opțional, cu ?) dă null.

Parametri

Parametru Descriere
numar Numărul grupului (0 = toată potrivirea).
nume Numele grupului, dat în model cu (?<nume>...).

Ce returnează

find: boolean. group: textul potrivit sau null.

Exemple

Exemplul 1: Toate sumele dintr-un extras de cont

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String extras = "12.10 Mega Image 87,50 lei; 13.10 Benzinărie 250 lei; 15.10 Farmacie 42,10 lei";
        Matcher m = Pattern.compile("(\\d+(?:,\\d+)?) lei").matcher(extras);

        double total = 0;
        while (m.find()) {
            String suma = m.group(1);
            System.out.println("Plată: " + m.group() + " -> " + suma);
            total += Double.parseDouble(suma.replace(',', '.'));
        }
        System.out.printf("Total: %.2f lei%n", total);
    }
}

Rezultat

Plată: 87,50 lei -> 87,50
Plată: 250 lei -> 250
Plată: 42,10 lei -> 42,10
Total: 379.60 lei

Exemplul 2: Grupuri cu nume: adrese de e-mail

Grupurile utilizator și domeniu se citesc după nume, nu după poziție.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String text = "Scrieți la ana.pop@exemplu.ro sau la secretariat@uaic.ro.";
        Pattern email = Pattern.compile("(?<utilizator>[\\w.]+)@(?<domeniu>[\\w-]+\\.ro)");
        Matcher m = email.matcher(text);
        while (m.find()) {
            System.out.println(m.group("utilizator") + " la " + m.group("domeniu"));
        }
        System.out.println("Grupuri în model: " + m.groupCount());
    }
}

Rezultat

ana.pop la exemplu.ro
secretariat la uaic.ro
Grupuri în model: 2

Greșeli frecvente

  • Apelezi group() fără find() înainte: IllegalStateException.
  • Folosești if (m.find()) când vrei toate potrivirile: găsești doar prima. Folosește while.
  • Numeri greșit grupurile: și parantezele imbricate primesc număr. Pentru paranteze care doar grupează, folosește (?:...), care nu primește număr.

Comenzi înrudite

  • Matcher: Obiectul care aplică un Pattern pe un text; matches verifică dacă tot textul se potrivește cu modelul.
  • Matcher.start: start dă poziția unde începe ultima potrivire, iar end poziția imediat după ea (ca la substring).
  • Matcher.results: Returnează toate potrivirile ca Stream<MatchResult>, ca să le prelucrezi cu map, filter, toList în loc de o buclă cu find.
  • Pattern: O expresie regulată compilată; compile o pregătește o dată, matcher o aplică pe un text ca să cauți potriviri.