String.replaceAll în Java

Înlocuiește toate (replaceAll) sau doar prima (replaceFirst) potrivire a unei expresii regulate.

Sintaxă
String replaceAll(String regex, String inlocuire)
String replaceFirst(String regex, String inlocuire)

Ce face String.replaceAll

replaceAll(regex, înlocuire) caută toate potrivirile expresiei regulate și le înlocuiește. replaceFirst o înlocuiește doar pe prima. Cu expresii regulate poți descrie tipare: "\\d" (o cifră), "\\s+" (spații), "[aeiou]" (o vocală).

În textul de înlocuire, $1, $2 înseamnă grupurile prinse între paranteze în expresie. De aceea caracterele $ și \ sunt speciale și aici: pentru un $ literal folosește Matcher.quoteReplacement("...").

Dacă nu ai nevoie de tipare, folosește replace, care caută textul exact.

Parametri

Parametru Descriere
regex Expresia regulată căutată.
inlocuire Textul pus în loc; poate conține $1, $2…

Ce returnează

Un șir nou.

Exemple

Exemplul 1: Ascunderea cifrelor și curățarea spațiilor

public class Main {
    public static void main(String[] args) {
        String card = "4111 2222 3333 4444";
        System.out.println(card.replaceAll("\\d(?=.{4})", "*"));
        String text = "Ana   are\t\tmere";
        System.out.println(text.replaceAll("\\s+", " "));
        System.out.println("tel: 0722-123-456".replaceAll("[^0-9]", ""));
    }
}

Rezultat

**** **** **** 4444
Ana are mere
0722123456

Exemplul 2: Grupuri: schimbarea formatului unei date

(\\d{4}) prinde anul în grupul 1, luna în grupul 2, ziua în grupul 3.

public class Main {
    public static void main(String[] args) {
        String data = "Examen: 2024-06-15, restanță: 2024-09-02";
        System.out.println(data.replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$3.$2.$1"));
        System.out.println(data.replaceFirst("(\\d{4})-(\\d{2})-(\\d{2})", "$3.$2.$1"));
    }
}

Rezultat

Examen: 15.06.2024, restanță: 02.09.2024
Examen: 15.06.2024, restanță: 2024-09-02

Exemplul 3: Semnul $ în înlocuire

import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        String sablon = "Preț: SUMA";
        try {
            System.out.println(sablon.replaceAll("SUMA", "$20"));
        } catch (IndexOutOfBoundsException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
        System.out.println(sablon.replaceAll("SUMA", Matcher.quoteReplacement("$20")));
        System.out.println(sablon.replace("SUMA", "$20"));
    }
}

Rezultat

Eroare: No group 2
Preț: $20
Preț: $20

Greșeli frecvente

  • Pui în înlocuire un text care conține $ sau \ (de exemplu o sumă în dolari): primești excepție sau rezultat greșit. Folosește Matcher.quoteReplacement sau replace.
  • Folosești replaceAll pentru un text fără tipar și uiți că punctul, parantezele și + sunt speciale.
  • În Java, backslash-ul trebuie dublat în literal: expresia \d se scrie "\\d".

Comenzi înrudite

  • String.replace: Înlocuiește toate aparițiile unui caracter sau ale unui text cu altul; textul este căutat literal.
  • String.matches: Verifică dacă ÎNTREGUL șir se potrivește cu o expresie regulată (validare de formate).
  • String.split: Împarte șirul în bucăți după un separator (expresie regulată) și returnează un array de String.