regexp.QuoteMeta în Go

Pune backslash înaintea caracterelor speciale ale expresiilor regulate (. + * ? ( ) [ ] etc.), ca textul să fie căutat exact.

Sintaxă
func QuoteMeta(s string) string

Ce face regexp.QuoteMeta

Caractere ca ., +, *, ?, (, ), [, ], {, }, ^, $, | și \ au sens special într-o expresie regulată: punctul înseamnă „orice caracter”. regexp.QuoteMeta(s) pune un backslash înaintea fiecăruia, astfel încât textul să se potrivească doar cu el însuși.

Folosește-o când construiești o expresie dintr-un text venit de la utilizator (un cuvânt căutat, un nume de fișier), ca să nu fie interpretat ca tipar.

Parametri

Parametru Descriere
s Textul care trebuie căutat exact.

Ce returnează

Textul cu caracterele speciale precedate de backslash.

Exemple

Exemplul 1: Căutarea exactă a unui text cu puncte

Fără QuoteMeta, punctul din „1.5” se potrivește cu orice caracter, deci și „105” este găsit.

package main

import (
	"fmt"
	"regexp"
)

func main() {
	cautat := "1.5"
	fmt.Println(regexp.QuoteMeta(cautat))
	text := "Prețuri: 105 lei, 1.5 lei"
	gresit := regexp.MustCompile(cautat)
	corect := regexp.MustCompile(regexp.QuoteMeta(cautat))
	fmt.Printf("%q\n", gresit.FindAllString(text, -1))
	fmt.Printf("%q\n", corect.FindAllString(text, -1))
}

Rezultat

1\.5
["105" "1.5"]
["1.5"]

Exemplul 2: Cuvânt căutat de utilizator, fără litere mari

package main

import (
	"fmt"
	"regexp"
)

func main() {
	cautare := "C++ (avansat)"
	re := regexp.MustCompile(`(?i)` + regexp.QuoteMeta(cautare))
	fmt.Println(re.String())
	fmt.Println(re.MatchString("Curs de c++ (Avansat) la Iași"))
}

Rezultat

(?i)C\+\+ \(avansat\)
true

Greșeli frecvente

  • Pui un text de la utilizator direct în regexp.MustCompile: un simplu „(” oprește programul cu panic, iar „.” găsește potriviri greșite. Trece-l întâi prin QuoteMeta.

Comenzi înrudite

  • regexp.MatchString: Verifică dintr-un singur apel dacă un text (string, []byte sau un RuneReader) se potrivește cu o expresie regulată.
  • regexp.Regexp: O expresie regulată compilată: o creezi o dată cu Compile sau MustCompile și o folosești de oricâte ori (MatchString, Find…, Replace…).
  • strings.Contains: Verifică dacă un text conține un alt text, unul dintre niște caractere, un caracter anume sau un caracter care respectă o condiție.