regexp.Regexp.ReplaceAllString în Go

Înlocuiește toate potrivirile cu un text (care poate folosi grupurile $1, ${nume}) sau cu rezultatul unei funcții.

Sintaxă
func (re *Regexp) ReplaceAllString(src, repl string) string
func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string

Ce face regexp.Regexp.ReplaceAllString

re.ReplaceAllString(src, repl) returnează o copie a lui src în care fiecare potrivire a fost înlocuită cu repl. În repl, $1, $2 … sunt înlocuite cu textul grupurilor, iar ${nume} cu grupul numit. Pentru un semn $ obișnuit scrie $$.

Atenție la numele grupurilor: $1x înseamnă grupul numit „1x” (care nu există, deci dă text gol). Scrie ${1}x. Dacă vrei ca repl să fie folosit exact, fără $ interpretat, folosește ReplaceAllLiteralString.

re.ReplaceAllStringFunc(src, repl) cheamă funcția repl pentru fiecare potrivire și pune în loc ce returnează ea. Așa poți face înlocuiri calculate: majuscule, conversii, mascări.

Parametri

Parametru Descriere
src Textul inițial.
repl Textul de înlocuire (cu $1, ${nume}) sau funcția care primește potrivirea și returnează înlocuirea.

Ce returnează

Textul nou, cu înlocuirile făcute.

Exemple

Exemplul 1: Schimbarea formatului unei date

package main

import (
	"fmt"
	"regexp"
)

func main() {
	re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
	fmt.Println(re.ReplaceAllString("Început: 2026-09-15, sfârșit: 2027-06-20", "$3.$2.$1"))

	reNume := regexp.MustCompile(`(?P<an>\d{4})-(?P<luna>\d{2})`)
	fmt.Println(reNume.ReplaceAllString("2026-10", "luna ${luna} din ${an}"))
	fmt.Printf("%q %q\n", re.ReplaceAllString("2026-01-02", "$1x"), re.ReplaceAllString("2026-01-02", "${1}x"))
}

Rezultat

Început: 15.09.2026, sfârșit: 20.06.2027
luna 10 din 2026
"" "2026x"

Exemplul 2: Spații multiple și mascarea numerelor de telefon

package main

import (
	"fmt"
	"regexp"
)

func main() {
	spatii := regexp.MustCompile(`\s+`)
	fmt.Printf("%q\n", spatii.ReplaceAllString("  Ana   are \t mere  ", " "))

	tel := regexp.MustCompile(`07\d{2}(\d{3})(\d{3})`)
	fmt.Println(tel.ReplaceAllString("Sunați la 0721000111 sau 0744123456.", "07** *** $2"))
}

Rezultat

" Ana are mere "
Sunați la 07** *** 111 sau 07** *** 456.

Exemplul 3: ReplaceAllStringFunc: înlocuire calculată

package main

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"
)

func main() {
	reNumar := regexp.MustCompile(`\d+`)
	dublat := reNumar.ReplaceAllStringFunc("3 mere și 12 pere", func(s string) string {
		n, _ := strconv.Atoi(s)
		return strconv.Itoa(n * 2)
	})
	fmt.Println(dublat)

	reOras := regexp.MustCompile(`\b(iasi|cluj)\b`)
	fmt.Println(reOras.ReplaceAllStringFunc("plecăm din iasi spre cluj", strings.ToUpper))
}

Rezultat

6 mere și 24 pere
plecăm din IASI spre CLUJ

Greșeli frecvente

  • Scrii "$1_nou" și grupul dispare: Go caută grupul numit „1_nou”. Folosește "${1}_nou".
  • Pui în repl un text venit de la utilizator care conține $: este interpretat ca grup. Folosește ReplaceAllLiteralString.
  • Folosești o expresie regulată pentru o înlocuire de text fix. strings.ReplaceAll este mai simplu și mai rapid.

Comenzi înrudite

  • strings.ReplaceAll: Înlocuiește toate aparițiile unui text cu altul (ReplaceAll) sau doar primele n (Replace).
  • regexp.Regexp.FindStringSubmatch: Returnează potrivirea împreună cu grupurile din paranteze; SubexpNames dă numele grupurilor (?P<nume>…).
  • regexp.Regexp.FindString: Găsește prima potrivire (FindString), toate potrivirile (FindAllString) sau poziția primei potriviri (FindStringIndex).
  • regexp.QuoteMeta: Pune backslash înaintea caracterelor speciale ale expresiilor regulate (. + * ? ( ) [ ] etc.), ca textul să fie căutat exact.