strings.IndexAny în Go

Poziția primului sau ultimului caracter dintr-un set (IndexAny) ori care respectă o condiție (IndexFunc); -1 dacă nu există.

Sintaxă
func IndexAny(s, chars string) int
func LastIndexAny(s, chars string) int
func IndexFunc(s string, f func(rune) bool) int
func LastIndexFunc(s string, f func(rune) bool) int

Ce face strings.IndexAny

strings.IndexAny(s, chars) returnează poziția primului caracter din s care apare în setul chars; LastIndexAny caută de la sfârșit. Exemplu: primul semn de punctuație din ".,;!?".

strings.IndexFunc(s, f) returnează poziția primului caracter pentru care funcția f returnează true, iar LastIndexFunc pe a ultimului. Funcția poate fi una din pachetul unicode (unicode.IsDigit, unicode.IsUpper) sau scrisă de tine.

Ca la strings.Index, poziția este în octeți, iar -1 înseamnă că nu s-a găsit nimic.

Parametri

Parametru Descriere
s Textul în care se caută.
chars Setul de caractere (la IndexAny și LastIndexAny).
f Condiția verificată pentru fiecare caracter (la IndexFunc și LastIndexFunc).

Ce returnează

Poziția în octeți sau -1.

Exemple

Exemplul 1: Primul semn de punctuație și prima cifră

package main

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

func main() {
	s := "Salut! Comanda ta nr. 4521 a plecat."
	fmt.Println("primul semn:", strings.IndexAny(s, ".,!?"))
	fmt.Println("ultimul semn:", strings.LastIndexAny(s, ".,!?"))
	i := strings.IndexFunc(s, unicode.IsDigit)
	j := strings.LastIndexFunc(s, unicode.IsDigit)
	fmt.Println("numărul comenzii:", s[i:j+1])
}

Rezultat

primul semn: 5
ultimul semn: 35
numărul comenzii: 4521

Exemplul 2: Condiție scrisă de tine

Căutăm prima literă cu diacritice românești. Funcția anonimă primește fiecare caracter.

package main

import (
	"fmt"
	"strings"
)

func main() {
	esteDiacritic := func(r rune) bool {
		return strings.ContainsRune("ăâîșțĂÂÎȘȚ", r)
	}
	for _, cuvant := range []string{"Cluj", "Brașov", "Târgu Mureș"} {
		i := strings.IndexFunc(cuvant, esteDiacritic)
		if i < 0 {
			fmt.Printf("%s: fără diacritice\n", cuvant)
			continue
		}
		fmt.Printf("%s: primul diacritic la octetul %d\n", cuvant, i)
	}
}

Rezultat

Cluj: fără diacritice
Brașov: primul diacritic la octetul 3
Târgu Mureș: primul diacritic la octetul 1

Greșeli frecvente

  • Crezi că IndexAny(s, "abc") caută textul „abc”. Caută oricare dintre caracterele a, b sau c.
  • Tai cu s[:j+1] după LastIndexFunc când ultimul caracter găsit are mai mulți octeți (de exemplu ș). j+1 ar tăia caracterul la jumătate; adaugă lungimea lui cu utf8.RuneLen.

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.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.
  • unicode.IsLetter: Verifică tipul unui caracter: literă, cifră, număr, spațiu alb sau semn de punctuație, după regulile Unicode.
  • strings.TrimFunc: Scoate de la capete caracterele pentru care funcția dată returnează true (la ambele capete, la început sau la sfârșit).