2013-03-10 13 views
53

さて、もちろん、私はそのようなregexp.Compile("[a-zA-Z]")ような場合、両方を処理するために、私の正規表現を書くことができますが、私の正規表現は、ユーザが指定した文字列から構築された:s.Nameが名前であるGoで大文字と小文字を区別しない正規表現を実行するにはどうすればよいですか?

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

。北西によって北のようなものになる可能性があります。さて、私にとって最も明白な解決策は、各文字のための「[nNの]」s.Nameの各文字を歩くと書くことになります:

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

しかし、私は、これはむしろ非エレガントなソリューションであると感じています。スピードは本当に問題ではありませんが、別の方法があるかどうかを知る必要があります。

答えて

105

であなたの正規表現文を前に付ける必要があるhttp://play.golang.org/p/WgpNhwWWuW

正規表現

これは正規表現の先頭に"(?i)"を追加することで行います。

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

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

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

フラグの詳細については、syntax documentationで「フラグ」という用語を検索してください。

+2

しかし、データが多いとこれは遅すぎます。 regexp.Matchでunicode.SimpleFoldを呼び出すので、文字をupperに変更し、regexpを使用して一致させることをお勧めします。これはスピードです。 後は時間データである:(?I) '' ' #By正規表現ケースを無視する XCMP/binに/ otacmp -o BSP_2.2.0.html -f BSP /フレームワークコード/フレームワーク1271.94sユーザー-f 7.32sシステム97%cpu 21:54.95合計 #上に一致すると一致します XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/frameworks -fコード/フレームワーク263.87sユーザー8.99sシステム110%cpu 4 :06.44合計 '' ' – QJGui

20

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

Reference

5

私が行くとあまり慣れていないんだけど、この例によると:あなたが最初の項目では、大文字と小文字を区別しないフラグを設定することができ(?i)

4

iフラグを使用してください。先端documentationを引用:

分類:

(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(クリア)またはXYZ(セット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) 
+16

コード内でこれらのi、m、s、Uを入れてください。 –

+15

この回答はマニュアルと同様に役に立たない。ありがたいことに、以下に実例があります。 –

関連する問題