regexp.Regexp.FindString în Go

Găsește prima potrivire (FindString), toate potrivirile (FindAllString) sau poziția primei potriviri (FindStringIndex).

Sintaxă
func (re *Regexp) FindString(s string) string
func (re *Regexp) FindAllString(s string, n int) []string
func (re *Regexp) FindStringIndex(s string) (loc []int)

Ce face regexp.Regexp.FindString

re.FindString(s) returnează textul primei potriviri sau textul gol dacă nu există niciuna. Pentru că o potrivire poate fi chiar textul gol, folosește FindStringIndex sau MatchString când trebuie să faci diferența.

re.FindAllString(s, n) returnează toate potrivirile care nu se suprapun, în ordine. n limitează numărul lor; -1 înseamnă toate. Dacă nu există potriviri, rezultatul este nil.

re.FindStringIndex(s) returnează pozițiile [început, sfârșit] ale primei potriviri, în octeți, astfel încât s[loc[0]:loc[1]] este textul găsit. Dacă nu există potrivire, returnează nil.

Parametri

Parametru Descriere
s Textul în care se caută.
n La FindAllString: numărul maxim de potriviri (-1 = toate).

Ce returnează

FindString: textul găsit sau "". FindAllString: []string sau nil. FindStringIndex: []int cu două poziții sau nil.

Exemple

Exemplul 1: Prețuri dintr-un text

package main

import (
	"fmt"
	"regexp"
)

func main() {
	re := regexp.MustCompile(`\d+(,\d+)? lei`)
	text := "Pâinea costă 4,50 lei, laptele 7 lei, iar cafeaua 32,90 lei."
	fmt.Println(re.FindString(text))
	fmt.Printf("%q\n", re.FindAllString(text, -1))
	fmt.Printf("%q\n", re.FindAllString(text, 2))
	fmt.Println("fără potriviri, nil:", re.FindAllString("fără prețuri", -1) == nil)
}

Rezultat

4,50 lei
["4,50 lei" "7 lei" "32,90 lei"]
["4,50 lei" "7 lei"]
fără potriviri, nil: true

Exemplul 2: Poziția potrivirii

Pozițiile sunt în octeți: „Născut în Iași, în ” are 19 caractere, dar 23 de octeți. Când nu există potrivire, rezultatul este nil, pe care Println îl afișează ca [].

package main

import (
	"fmt"
	"regexp"
)

func main() {
	re := regexp.MustCompile(`\d{4}`)
	s := "Născut în Iași, în 2001."
	loc := re.FindStringIndex(s)
	fmt.Println(loc)
	fmt.Println("an:", s[loc[0]:loc[1]], "| înainte:", s[:loc[0]])
	fmt.Println(re.FindStringIndex("fără an"))
}

Rezultat

[23 27]
an: 2001 | înainte: Născut în Iași, în 
[]

Exemplul 3: Cuvintele românești dintr-un text

package main

import (
	"fmt"
	"regexp"
)

func main() {
	text := "Știința și arta, în Țara Românească."
	fmt.Printf("%q\n", regexp.MustCompile(`\w+`).FindAllString(text, -1))
	fmt.Printf("%q\n", regexp.MustCompile(`\p{L}+`).FindAllString(text, -1))
}

Rezultat

["tiin" "a" "i" "arta" "n" "ara" "Rom" "neasc"]
["Știința" "și" "arta" "în" "Țara" "Românească"]

Greșeli frecvente

  • Verifici FindString(s) != "" ca să afli dacă există potrivire. Pentru expresii care se pot potrivi cu textul gol (de exemplu a*) rezultatul este greșit; folosește MatchString sau FindStringIndex.
  • Folosești pozițiile din FindStringIndex ca numere de caractere: sunt octeți.

Comenzi înrudite

  • regexp.Regexp.FindStringSubmatch: Returnează potrivirea împreună cu grupurile din paranteze; SubexpNames dă numele grupurilor (?P<nume>…).
  • 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…).
  • regexp.Regexp.ReplaceAllString: Înlocuiește toate potrivirile cu un text (care poate folosi grupurile $1, ${nume}) sau cu rezultatul unei funcții.
  • strings.Index: Returnează poziția (în octeți) a primei sau ultimei apariții a unui text, octet sau caracter; -1 dacă nu există.