Matcher.results în Java

Returnează toate potrivirile ca Stream<MatchResult>, ca să le prelucrezi cu map, filter, toList în loc de o buclă cu find.

Sintaxă
Stream<MatchResult> results()

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 cu find().

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).