web-dev-qa-db-ja.com

golangでの大文字と小文字を区別しない文字列検索

大文字と小文字を区別しない方法でWordのファイルを検索するにはどうすればよいですか?

たとえば

ファイルでUpdaTeを検索している場合、ファイルに更新が含まれている場合、検索でそれを選択し、一致としてカウントする必要があります。

25
user3841581

strings.EqualFold()は、大文字と小文字を区別せずに、2つの文字列が等しいかどうかを確認できます。ユニコードでも動作します。詳細については、 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"))
}

両方ともtrueを返します。

59
425nesp

おそらくあなたの質問の重要な部分は検索であり、ファイルからの読み取りに関する部分ではないので、私はその部分に答えます。

おそらくこれを行う最も簡単な方法は、両方の文字列(検索対象の文字列と検索対象の文字列)をすべて大文字またはすべて小文字に変換してから検索することです。例えば:

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

実際に見ることができます here

13
joshlf

使ってはいけません strings.Contains言語が正しい文字列検索ではなく完全一致が必要な場合を除き

検索のみを行っている場合を除き、現在の回答はどれも正しくありません ASCII文字 特定の分音記号/ウムラウトまたは他のユニコードグリフ修飾子なしの少数の言語(英語など)スナップ)。 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);
}

または、開始インデックスのみが必要な場合:

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);
}

language.Tag structs here 検索したい言語を見つけるか、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)
}
6
Xeoncross

ファイルが大きい場合、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)))

bufioについて

Bufioパッケージは、多くの小さな読み取りの効率と、追加の読み取り方法のために役立つ可能性のあるバッファー付きリーダーを実装します。

6
chendesheng