web-dev-qa-db-ja.com

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

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

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

どこ s.Nameは名前です。 「North by Northwest」のようなものかもしれません。さて、私にとって最も明らかな解決策は、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]))
  }
}

しかし、これはかなりエレガントなソリューションではないと感じています。速度は本当に心配ではありませんが、別の方法があるかどうかを知る必要があります。

68
Svip

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

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

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

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

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

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

140
Daniel

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

参照

23
Qtax

私はGoにあまり詳しくありませんが、この例によると http://play.golang.org/p/WgpNhwWWuW

正規表現ステートメントの前に(?i)を付ける必要があります

6
Adam Plocher

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)
5
zzzz