大文字と小文字を区別しない方法でWordのファイルを検索するにはどうすればよいですか?
たとえば
ファイルでUpdaTe
を検索している場合、ファイルに更新が含まれている場合、検索でそれを選択し、一致としてカウントする必要があります。
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を返します。
おそらくあなたの質問の重要な部分は検索であり、ファイルからの読み取りに関する部分ではないので、私はその部分に答えます。
おそらくこれを行う最も簡単な方法は、両方の文字列(検索対象の文字列と検索対象の文字列)をすべて大文字またはすべて小文字に変換してから検索することです。例えば:
func CaseInsensitiveContains(s, substr string) bool {
s, substr = strings.ToUpper(s), strings.ToUpper(substr)
return strings.Contains(s, substr)
}
実際に見ることができます here 。
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)
}
ファイルが大きい場合、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パッケージは、多くの小さな読み取りの効率と、追加の読み取り方法のために役立つ可能性のあるバッファー付きリーダーを実装します。