todas solo poner net minuscula mayusculas mayuscula letra convertir string go case-insensitive string-search

string - poner - solo mayuscula vb net



Búsqueda de cadenas insensibles a mayúsculas en Golang (4)

¿Cómo busco en un archivo una palabra de una manera que no distingue entre mayúsculas y minúsculas ?

Por ejemplo

Si estoy buscando UpdaTe en el archivo, si el archivo contiene actualización, la búsqueda debería seleccionarlo y contarlo como una coincidencia.


No use strings.Contains menos que necesite una coincidencia exacta en lugar de búsquedas de cadenas correctas en el idioma

Ninguna de las respuestas actuales es correcta a menos que solo esté buscando caracteres ASCII en la mayoría de los idiomas (como el inglés) sin cierta diéresis / diéresis u otros modificadores de glifos de Unicode (la forma más "correcta" de definirlo como lo menciona @snap). La frase de Google estándar es "buscar caracteres no ASCII".

Para obtener el soporte adecuado para la búsqueda de idiomas, debe utilizar http://golang.org/x/text/search .

func SearchForString(str string, substr string) (int, int) { m := search.New(language.English, search.IgnoreCase) return = m.IndexString(str, substr) } start, end := SearchForString(''foobar'', ''bar''); if start != -1 && end != -1 { fmt.Println("found at", start, end); }

O si solo quieres el índice de inicio:

func SearchForStringIndex(str string, substr string) (int, bool) { m := search.New(language.English, search.IgnoreCase) start, _ := m.IndexString(str, substr) if start == -1 { return 0, false } return start, true } index, found := SearchForStringIndex(''foobar'', ''bar''); if found { fmt.Println("match starts at", index); }

Busque el language.Tag Haga clic aquí para buscar el idioma con el que desea buscar o usar el language.Und si no está seguro.

Actualizar

Parece que hay cierta confusión, por lo que este siguiente ejemplo debería ayudar a aclarar las cosas.

package main import ( "fmt" "strings" "golang.org/x/text/language" "golang.org/x/text/search" ) var s = `Æ` var s2 = `Ä` func main() { m := search.New(language.Finnish, search.IgnoreDiacritics) fmt.Println(m.IndexString(s, s2)) fmt.Println(CaseInsensitiveContains(s, s2)) } // CaseInsensitiveContains in string func CaseInsensitiveContains(s, substr string) bool { s, substr = strings.ToUpper(s), strings.ToUpper(substr) return strings.Contains(s, substr) }


Presumiblemente, la parte importante de su pregunta es la búsqueda, no la parte sobre la lectura de un archivo, así que solo responderé esa parte.

Probablemente, la forma más sencilla de hacerlo es convertir ambas cadenas (la que está buscando y la que está buscando) en mayúsculas o en minúsculas, y luego buscar. Por ejemplo:

func CaseInsensitiveContains(s, substr string) bool { s, substr = strings.ToUpper(s), strings.ToUpper(substr) return strings.Contains(s, substr) }

Puedes verlo en acción here .


Si su archivo es grande, puede usar regexp y bufio:

//create a regex `(?i)update` will match string contains "update" case insensitive reg := regexp.MustCompile("(?i)update") f, err := os.Open("test.txt") if err != nil { log.Fatal(err) } defer f.Close() //Do the match operation //MatchReader function will scan entire file byte by byte until find the match //use bufio here avoid load enter file into memory println(reg.MatchReader(bufio.NewReader(f)))

Sobre bufio

El paquete bufio implementa un lector de búfer que puede ser útil tanto por su eficiencia con muchas lecturas pequeñas como por los métodos de lectura adicionales que proporciona.


strings.EqualFold() puede verificar si dos cadenas son iguales, mientras ignora el caso. Incluso funciona con Unicode. Consulte http://golang.org/pkg/strings/#EqualFold para obtener más información.

http://play.golang.org/p/KDdIi8c3Ar

package main import ( "fmt" "strings" ) func main() { fmt.Println(strings.EqualFold("HELLO", "hello")) fmt.Println(strings.EqualFold("ÑOÑO", "ñoño")) }

Ambos devuelven la verdad.