Pattern în Java

O expresie regulată compilată; compile o pregătește o dată, matcher o aplică pe un text ca să cauți potriviri.

Sintaxă
import java.util.regex.Pattern;

static Pattern compile(String regex)
static Pattern compile(String regex, int optiuni)
Matcher matcher(CharSequence text)

Ce face Pattern

O expresie regulată (regex) descrie un model de text: \d+ înseamnă „una sau mai multe cifre”, [A-Z]{2} „două litere mari”. Pattern.compile(regex) verifică și transformă modelul într-un obiect Pattern, care poate fi folosit de oricâte ori.

pattern.matcher(text) creează un Matcher, obiectul care face căutarea efectivă în text: matches(), find(), group(), replaceAll(). Același Pattern poate crea matcher-e pentru multe texte.

În codul Java, backslash-ul trebuie dublat: regex-ul \d se scrie "\\d". Opțiuni ca Pattern.CASE_INSENSITIVE (fără diferență între litere mari și mici) se dau ca al doilea argument. Un model greșit aruncă PatternSyntaxException.

Parametri

Parametru Descriere
regex Modelul, ca text.
optiuni Opțional: Pattern.CASE_INSENSITIVE, Pattern.UNICODE_CASE, Pattern.MULTILINE, combinate cu |.
text Pentru matcher: textul în care se caută.

Ce returnează

compile: un Pattern. matcher: un Matcher.

Exemple

Exemplul 1: Un model folosit pentru mai multe texte

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern numarAuto = Pattern.compile("[A-Z]{1,2} \\d{2,3} [A-Z]{3}");

        String[] numere = {"IS 12 ABC", "B 123 XYZ", "is 12 abc", "CJ 1 AB"};
        for (String n : numere) {
            System.out.println(n + " -> " + numarAuto.matcher(n).matches());
        }
    }
}

Rezultat

IS 12 ABC -> true
B 123 XYZ -> true
is 12 abc -> false
CJ 1 AB -> false

Exemplul 2: Toate numerele de telefon dintr-un text

find() caută potrivirile una după alta; CASE_INSENSITIVE face ca „TEL” și „tel” să fie la fel.

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

public class Main {
    public static void main(String[] args) {
        String anunt = "Vând bicicletă. Tel: 0722 111 222 sau TEL 0744-333-444, după ora 18.";
        Pattern telefon = Pattern.compile("tel:?\\s*(07\\d{2}[ -]?\\d{3}[ -]?\\d{3})", Pattern.CASE_INSENSITIVE);

        Matcher m = telefon.matcher(anunt);
        while (m.find()) {
            System.out.println("Găsit: " + m.group(1));
        }
    }
}

Rezultat

Găsit: 0722 111 222
Găsit: 0744-333-444

Greșeli frecvente

  • Scrii "\d" cu un singur backslash: nu compilează („illegal escape character”). În Java scrii "\\d".
  • Compilezi același model în fiecare iterație a unei bucle. Pattern.compile costă; păstrează Pattern-ul într-o constantă static final.
  • Folosești CASE_INSENSITIVE pentru litere românești: fără Pattern.UNICODE_CASE, „Ș” și „ș” nu sunt considerate la fel.

Comenzi înrudite

  • Matcher: Obiectul care aplică un Pattern pe un text; matches verifică dacă tot textul se potrivește cu modelul.
  • Pattern.matches: Verifică într-un singur apel dacă tot textul respectă o expresie regulată (fără să păstrezi Pattern-ul).
  • Pattern.split: Împarte un text în bucăți acolo unde se potrivește modelul (ex. virgulă cu spații în jur) și returnează un tablou.
  • Matcher.find: find caută următoarea potrivire în text; group returnează textul găsit sau doar partea dintr-un grup (paranteze).
  • String.matches: Verifică dacă ÎNTREGUL șir se potrivește cu o expresie regulată (validare de formate).