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ăLastIndexFunccând ultimul caracter găsit are mai mulți octeți (de exemplu ș).j+1ar tăia caracterul la jumătate; adaugă lungimea lui cuutf8.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).