Matcher.start în Java

start dă poziția unde începe ultima potrivire, iar end poziția imediat după ea (ca la substring).

Sintaxă
int start()
int end()
int start(int grup)
int end(int grup)

Ce face Matcher.start

După un find() sau matches() reușit, start() returnează indicele primului caracter găsit, iar end() indicele de după ultimul caracter. Astfel text.substring(m.start(), m.end()) este exact m.group(), iar end() - start() este lungimea potrivirii.

Variantele cu un număr de grup dau pozițiile acelui grup. Pozițiile sunt utile pentru evidențieri (de exemplu, încadrarea cuvântului găsit în paranteze) sau pentru a afișa unde a apărut o eroare.

Parametri

Parametru Descriere
grup Opțional: numărul grupului.

Ce returnează

Un indice int în text.

Exemple

Exemplul 1: Unde apare cuvântul căutat

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

public class Main {
    public static void main(String[] args) {
        String text = "Java e simplu. Învăț Java la Iași.";
        Matcher m = Pattern.compile("Java").matcher(text);
        while (m.find()) {
            System.out.println("De la " + m.start() + " până la " + m.end() + ": " + text.substring(m.start(), m.end()));
        }
    }
}

Rezultat

De la 0 până la 4: Java
De la 21 până la 25: Java

Exemplul 2: Evidențierea numerelor dintr-un text

Construim textul nou bucată cu bucată: partea dinaintea potrivirii, apoi potrivirea între paranteze drepte.

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

public class Main {
    public static void main(String[] args) {
        String text = "Am 3 mere, 12 pere și 7 prune.";
        Matcher m = Pattern.compile("\\d+").matcher(text);
        StringBuilder sb = new StringBuilder();
        int ultim = 0;
        while (m.find()) {
            sb.append(text, ultim, m.start()).append('[').append(m.group()).append(']');
            ultim = m.end();
        }
        sb.append(text.substring(ultim));
        System.out.println(sb);
    }
}

Rezultat

Am [3] mere, [12] pere și [7] prune.

Greșeli frecvente

  • Crezi că end() este poziția ultimului caracter. Este poziția de după el, ca al doilea argument al lui substring.
  • Apelezi start() după un find() care a dat false: IllegalStateException.

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.
  • String.substring: Returnează o bucată din șir: de la beginIndex (inclusiv) până la endIndex (exclusiv) sau până la final.
  • Matcher.replaceAll: Înlocuiește toate potrivirile din text; în înlocuire $1 reprezintă grupul 1, iar varianta cu funcție calculează textul nou.