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ștewhile. - 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.