strings.ReplaceAll în Go

Împărțire, înlocuire și transformare (strings) Go 1.0 (ReplaceAll din Go 1.12)

Înlocuiește toate aparițiile unui text cu altul (ReplaceAll) sau doar primele n (Replace).

Sintaxă
func ReplaceAll(s, old, new string) string
func Replace(s, old, new string, n int) string
func NewReplacer(oldnew ...string) *Replacer

Ce face strings.ReplaceAll

strings.ReplaceAll(s, old, new) returnează un text nou în care fiecare apariție a lui old a fost înlocuită cu new. Textul inițial nu se schimbă: în Go textele sunt imuabile.

strings.Replace(s, old, new, n) înlocuiește doar primele n apariții; cu n = -1 le înlocuiește pe toate, exact ca ReplaceAll. Dacă new este gol, aparițiile sunt șterse.

Pentru mai multe înlocuiri deodată folosește strings.NewReplacer("ș", "s", "ț", "t"). Primește perechi vechi, nou (un număr par de argumente; altfel panic) și returnează un *strings.Replacer, pe care îl creezi o dată și îl folosești de oricâte ori cu r.Replace(text) sau r.WriteString(w, text). Toate înlocuirile se fac într-o singură trecere prin text, deci o înlocuire nu o afectează pe alta; la aceeași poziție câștigă perechea scrisă prima. Un Replacer poate fi folosit din mai multe goroutine. Pentru tipare (orice număr, orice spațiu) folosește regexp.ReplaceAllString.

Parametri

Parametru Descriere
s Textul inițial.
old Textul căutat.
new Textul pus în loc (poate fi gol, pentru ștergere).
n La Replace: câte înlocuiri se fac (-1 = toate).

Ce returnează

Un text nou, cu înlocuirile făcute.

Exemple

Exemplul 1: Înlocuire completă și parțială

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "pisica, pisica, pisica"
	fmt.Println(strings.ReplaceAll(s, "pisica", "câinele"))
	fmt.Println(strings.Replace(s, "pisica", "câinele", 1))
	fmt.Println(strings.Replace(s, "pisica", "câinele", 2))
	fmt.Println(strings.ReplaceAll("0721 000 111", " ", ""))
	fmt.Println("originalul rămâne:", s)
}

Rezultat

câinele, câinele, câinele
câinele, pisica, pisica
câinele, câinele, pisica
0721000111
originalul rămâne: pisica, pisica, pisica

Exemplul 2: Mai multe înlocuiri cu strings.NewReplacer

Replacer face toate înlocurile într-o singură trecere. Aici scoatem diacriticele pentru un nume de fișier.

package main

import (
	"fmt"
	"strings"
)

func main() {
	faraDiacritice := strings.NewReplacer(
		"ă", "a", "â", "a", "î", "i", "ș", "s", "ț", "t",
		"Ă", "A", "Â", "A", "Î", "I", "Ș", "S", "Ț", "T",
		" ", "-",
	)
	fmt.Println(faraDiacritice.Replace("Știri din Târgu Mureș și Brăila"))
}

Rezultat

Stiri-din-Targu-Mures-si-Braila

Greșeli frecvente

  • Apelezi strings.ReplaceAll(s, "a", "b") fără să salvezi rezultatul. s nu se schimbă; scrie s = strings.ReplaceAll(s, "a", "b").
  • Faci înlocuiri în lanț care se influențează între ele (a→b, apoi b→c transformă și literele a în c). strings.NewReplacer face toate înlocuirile odată, fără acest efect.
  • Cu old gol, Replace inserează new înainte de fiecare caracter și la final, rareori ce vrei.

Comenzi înrudite

  • strings.Map: Transformă fiecare caracter al textului cu o funcție; dacă funcția returnează -1, caracterul este șters.
  • regexp.Regexp.ReplaceAllString: Înlocuiește toate potrivirile cu un text (care poate folosi grupurile $1, ${nume}) sau cu rezultatul unei funcții.
  • strings.Trim: Scoate de la capete orice caracter din setul dat: Trim la ambele capete, TrimLeft doar la început, TrimRight doar la sfârșit.