Goで大文字と小文字を区別しない正規表現を行うにはどうすればよいですか?


84

もちろん、のように両方のケースを処理する正規表現を書くこともできますregexp.Compile("[a-zA-Z]")が、正規表現はユーザーが指定した文字列から作成されます。

reg, err := regexp.Compile(strings.Replace(s.Name, " ", "[ \\._-]", -1))

s.Name名前はどこですか。これは「NorthbyNorthwest」のようなものである可能性があります。さて、私にとって最も明白な解決策はs.Name、の各文字をウォークスルーし、各文字に「[nN]」と書くことです。

for i := 0; i < len(s.Name); i++ {
  if s.Name[i] == " " {
    fmt.Fprintf(str, "%s[ \\._-]", str);
  } else {
    fmt.Fprintf(str, "%s[%s%s]", str, strings.ToLower(s.Name[i]), strings.ToUpper(s.Name[i]))
  }
}

しかし、これはかなりエレガントではない解決策だと思います。速度はそれほど問題ではありませんが、別の方法があるかどうかを知る必要があります。

回答:


171

正規表現の最初の項目として、大文字と小文字を区別しないフラグを設定できます。

これを行うに"(?i)"は、正規表現の先頭に追加します。

reg, err := regexp.Compile("(?i)"+strings.Replace(s.Name, " ", "[ \\._-]", -1))

固定正規表現の場合、次のようになります。

r := regexp.MustCompile(`(?i)CaSe`)

フラグの詳細については、regexp/syntaxパッケージのドキュメント(または構文のドキュメント)で「フラグ」という用語を検索してください 。


4
しかし、データが多い場合、これは遅すぎることがわかりました。regexp.Matchでunicode.SimpleFoldを呼び出すため、文字を大文字に変更してから、正規表現を使用して一致させることをお勧めします。これがスピードです。以下は時間データです: `` `#By(?i)regexp to ignore case XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / frameworks -f Code / frameworks 1271.94s user 7.32s system 97%cpu 21:54.95合計#BytoUpperおよび一致XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / frameworks-fコード/フレームワーク263.87sユーザー8.99sシステム110%cpu 4:06.44合計 `` `
QJGui

1
大文字と小文字を区別しない正規表現のパフォーマンスの低下は、次の月に修正された既知のバグのようです:github.com/golang/go/issues/13288
Dan Esparza

29

(?i)パターンの先頭にを追加して、大文字と小文字を区別しないようにすることができます。

参照



4

iフラグを使用します。ヒントドキュメントの引用:

グループ化:

(re)           numbered capturing group
(?P<name>re)   named & numbered capturing group
(?:re)         non-capturing group
(?flags)       set flags within current group; non-capturing
(?flags:re)    set flags during re; non-capturing

フラグの構文は、xyz(セット)または-xyz(クリア)またはxy-z(セットxy、クリアz)です。フラグは次のとおりです。

i              case-insensitive (default false)
m              multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
s              let . match \n (default false)
U              ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false)

22
コードのどこにこれらのi、m、s、Uを配置する必要がありますか?
Qian Chen

25
この答えは、ドキュメントと同じくらい役に立ちません。ありがたいことに、以下に実際の例があります。
laurent 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.