strings.Contains în Go

Căutare și comparare în texte (strings) Go 1.0 (ContainsFunc din Go 1.21)

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.

Sintaxă
func Contains(s, substr string) bool
func ContainsAny(s, chars string) bool
func ContainsRune(s string, r rune) bool
func ContainsFunc(s string, f func(rune) bool) bool

Ce face strings.Contains

strings.Contains(s, substr) returnează true dacă textul substr apare undeva în s. Comparația ține cont de litere mari și mici și de diacritice: „iasi” nu este găsit în „Iași”. Un substr gol este găsit în orice text.

Variantele: ContainsAny(s, chars) verifică dacă s conține măcar unul dintre caracterele din chars; ContainsRune(s, r) caută un singur caracter (o valoare rune, scrisă între apostrofuri: 'ș'); ContainsFunc(s, f) verifică dacă vreun caracter respectă condiția dată de funcția f, de exemplu unicode.IsDigit.

Dacă ai nevoie și de poziție, folosește strings.Index. Pentru o căutare fără să conteze literele mari, transformă ambele texte cu strings.ToLower sau compară cu strings.EqualFold.

Parametri

Parametru Descriere
s Textul în care se caută.
substr Textul căutat.
chars La ContainsAny: setul de caractere; ajunge să apară unul singur.
r La ContainsRune: caracterul căutat.
f La ContainsFunc: funcția care primește fiecare caracter și spune dacă e cel căutat.

Ce returnează

true dacă s-a găsit, altfel false.

Exemple

Exemplul 1: Căutarea unui cuvânt

package main

import (
	"fmt"
	"strings"
)

func main() {
	adresa := "Str. Lăpușneanu 12, Iași"
	fmt.Println(strings.Contains(adresa, "Iași"))
	fmt.Println(strings.Contains(adresa, "iasi"))
	fmt.Println(strings.Contains(strings.ToLower(adresa), "iași"))
	fmt.Println(strings.Contains(adresa, ""))
}

Rezultat

true
false
true
true

Exemplul 2: ContainsAny, ContainsRune și ContainsFunc

Verificăm o parolă: are un caracter special? are o cifră? are litera ș? unicode.IsDigit se dă fără paranteze, ca valoare-funcție.

package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	for _, parola := range []string{"mașina2026!", "soare"} {
		fmt.Printf("%-12s special: %-5t cifră: %-5t are ș: %t\n",
			parola,
			strings.ContainsAny(parola, "!@#$%"),
			strings.ContainsFunc(parola, unicode.IsDigit),
			strings.ContainsRune(parola, 'ș'))
	}
}

Rezultat

mașina2026!  special: true  cifră: true  are ș: true
soare        special: false cifră: false are ș: false

Greșeli frecvente

  • Te aștepți ca Contains să ignore literele mari sau diacriticele. Nu le ignoră: „Brasov” nu este găsit în „Brașov”.
  • Confunzi ContainsAny(s, "abc") cu Contains(s, "abc"). Prima caută oricare dintre literele a, b, c; a doua caută textul „abc” întreg.
  • Scrii ContainsRune(s, "ș") cu ghilimele. Ghilimelele dau un string; pentru rune folosește apostrofuri: 'ș'.

Comenzi înrudite

  • strings.Index: Returnează poziția (în octeți) a primei sau ultimei apariții a unui text, octet sau caracter; -1 dacă nu există.
  • strings.HasPrefix: Verifică dacă un text începe (HasPrefix) sau se termină (HasSuffix) cu un anumit text.
  • strings.Count: Numără de câte ori apare un text în alt text, fără suprapuneri.
  • strings.EqualFold: Compară două texte fără să țină cont de litere mari și mici, corect și pentru diacritice.
  • unicode.IsLetter: Verifică tipul unui caracter: literă, cifră, număr, spațiu alb sau semn de punctuație, după regulile Unicode.