golang中不区分大小写的字符串搜索

use*_*581 26 string case-insensitive go string-search

如何以不区分大小写的方式在文件中搜索单词?

例如

如果我UpdaTe在文件中搜索,如果文件包含更新,搜索应该选择它并将其计为匹配.

425*_*esp 61

strings.EqualFold()可以检查两个字符串是否相等,而忽略大小写.它甚至适用于Unicode.有关详细信息,请参阅http://golang.org/pkg/strings/#EqualFold.

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"))
}
Run Code Online (Sandbox Code Playgroud)

两者都归于真.

  • 这不是OP实际想要的东西(即使原来的标题曾经这么说).您无法实际使用它来搜索大文件中的子字符串. (12认同)

jos*_*hlf 13

大概你问题的重要部分是搜索,而不是关于从文件中读取的部分,所以我只回答那部分内容.

可能最简单的方法是将两个字符串(您正在搜索的字符串和您正在搜索的字符串)转换为全部大写或全部小写,然后搜索.例如:

func CaseInsensitiveContains(s, substr string) bool {
    s, substr = strings.ToUpper(s), strings.ToUpper(substr)
    return strings.Contains(s, substr)
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到它.

  • 这不会使答案出错,只会使其性能不佳。例如,如果您想将此答案修改为保留大写字符串的副本,以便每次搜索时都不必执行转换,您当然可以这样做。 (3认同)

che*_*eng 6

如果您的文件很大,可以使用regexp和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)))
Run Code Online (Sandbox Code Playgroud)

关于bufio

bufio包实现了一个缓冲读取器,它既可以用于许多小读取的效率,也可以用于提供额外的读取方法.


Xeo*_*oss 6

strings.Contains除非您需要完全匹配而不是语言正确的字符串搜索,否则不要使用

除非您仅搜索少数语言(例如英语)的ASCII字符 ,而没有某些音调/变音符号或其他unicode字形修饰符(如@snap所提到的那样,它是更“正确”的定义方式),否则当前答案都不正确。Google的标准短语是“搜索非ASCII字符”。

为了获得适当的语言搜索支持,您需要使用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);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想要起始索引:

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);
}
Run Code Online (Sandbox Code Playgroud)

language.Tag此处搜索结构,以查找您要搜索或language.Und不确定使用的语言。

更新资料

似乎有些混乱,因此下面的示例应有助于澄清问题。

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)
}
Run Code Online (Sandbox Code Playgroud)