Ce face Matcher.results
results() face bucla while (m.find()) pentru tine și dă fiecare potrivire ca MatchResult. Un MatchResult are aceleași metode de citire ca Matcher: group(), group(n), start(), end().
Pe stream poți aplica orice operație: map(MatchResult::group) pentru textele găsite, count() pentru numărul de potriviri, mapToInt pentru a aduna numere. Matcher-ul este consumat; pentru o nouă parcurgere apelează reset() sau creează altul.
Ce returnează
Un Stream<MatchResult> cu potrivirile, în ordinea din text.
Exemple
Exemplul 1: Hashtag-urile dintr-o postare
import java.util.List;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String postare = "Weekend la munte #Sinaia #Bucegi #vacanta, apoi acasă #Iasi";
List<String> etichete = Pattern.compile("#(\\w+)").matcher(postare)
.results()
.map(r -> r.group(1))
.toList();
System.out.println(etichete);
System.out.println("Câte: " + Pattern.compile("#\\w+").matcher(postare).results().count());
Pattern.compile("#\\w+").matcher(postare).results()
.map(MatchResult::start)
.forEach(p -> System.out.print(p + " "));
System.out.println();
}
}
Rezultat
[Sinaia, Bucegi, vacanta, Iasi]
Câte: 4
17 25 33 54
Exemplul 2: Suma tuturor numerelor dintr-un text
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String bon = "2 x pâine = 9 lei, 1 x lapte = 8 lei, 3 x iaurt = 12 lei";
int total = Pattern.compile("(\\d+) lei").matcher(bon)
.results()
.mapToInt(r -> Integer.parseInt(r.group(1)))
.sum();
System.out.println("Total bon: " + total + " lei");
}
}
Rezultat
Total bon: 29 lei
Greșeli frecvente
- Apelezi
results()de două ori pe același matcher: a doua oară stream-ul pornește de unde s-a oprit primul (la final) și e gol. Creează un matcher nou. - Folosești
results()pe Java 8: metoda există din Java 9; acolo rămâne bucla cufind().
Comenzi înrudite
Matcher.find: find caută următoarea potrivire în text; group returnează textul găsit sau doar partea dintr-un grup (paranteze).Matcher: Obiectul care aplică un Pattern pe un text; matches verifică dacă tot textul se potrivește cu modelul.Stream.map: Transformă fiecare element al stream-ului în altă valoare, eventual de alt tip.IntStream.sum: sum adună numerele din IntStream; average dă media lor ca OptionalDouble (gol dacă nu există numere).