Pattern.quote în Java

Transformă un text într-un model care se potrivește exact cu el, chiar dacă are caractere speciale (. * + ? |).

Sintaxă
static String quote(String text)
static String Matcher.quoteReplacement(String text)

Ce face Pattern.quote

În regex, caractere ca ., *, +, ?, |, (, $ au sens special. Pattern.quote(text) returnează un model care caută textul literal, caracter cu caracter, adăugând marcajele \Q și \E în jurul lui.

Este important când modelul vine de la utilizator sau din date: căutarea lui „1.5” fără quote s-ar potrivi și cu „125”. Pentru textul de înlocuire din replaceAll, unde $ și \ sunt speciale, folosește Matcher.quoteReplacement.

Parametri

Parametru Descriere
text Textul care trebuie căutat exact.

Ce returnează

Un String folosit ca model regex.

Exemple

Exemplul 1: Punctul ca separator

split(".") dă un tablou gol: în regex punctul înseamnă „orice caracter”, deci fiecare caracter devine separator. Cu Pattern.quote punctul este căutat ca atare.

import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String ip = "192.168.1.10";
        System.out.println(Arrays.toString(ip.split(".")));
        System.out.println(Arrays.toString(ip.split(Pattern.quote("."))));
        System.out.println(Pattern.quote("."));
    }
}

Rezultat

[]
[192, 168, 1, 10]
\Q.\E

Exemplul 2: Căutarea unui text scris de utilizator

Utilizatorul caută „1.5”. Fără quote, punctul înseamnă „orice caracter”, deci se potrivește și cu „125”. La înlocuire, quoteReplacement păstrează semnul $.

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

public class Main {
    public static void main(String[] args) {
        String text = "Ulei 1.5 l costă 12 lei; pachet 125 g.";
        String cautat = "1.5";

        System.out.println(Pattern.compile(cautat).matcher(text).results().map(r -> r.group()).toList());
        System.out.println(Pattern.compile(Pattern.quote(cautat)).matcher(text).results().map(r -> r.group()).toList());

        String inlocuire = "$1.5";
        System.out.println(text.replaceAll(Pattern.quote(cautat), Matcher.quoteReplacement(inlocuire)));
    }
}

Rezultat

[1.5, 125]
[1.5]
Ulei $1.5 l costă 12 lei; pachet 125 g.

Greșeli frecvente

  • Construiești un model din textul utilizatorului fără quote. Un text ca ( aruncă PatternSyntaxException, iar .* se potrivește cu orice.
  • Folosești Pattern.quote pentru textul de înlocuire. Acolo trebuie Matcher.quoteReplacement.

Comenzi înrudite

  • 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.
  • Pattern: O expresie regulată compilată; compile o pregătește o dată, matcher o aplică pe un text ca să cauți potriviri.
  • Matcher.replaceAll: Înlocuiește toate potrivirile din text; în înlocuire $1 reprezintă grupul 1, iar varianta cu funcție calculează textul nou.
  • String.replace: Înlocuiește toate aparițiile unui caracter sau ale unui text cu altul; textul este căutat literal.