2013-03-10 14 views
53

Şimdi, tabii ki, ben regexp.Compile("[a-zA-Z]") gibi hem davalarını benim düzenli ifade yazabilirsiniz, ama benim düzenli ifade kullanıcı tarafından verilen bir dize inşa edilmiştir:Git'te büyük/küçük harf duyarlı bir normal ifadeyi nasıl yaparım?

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

s.Name adıdır. Hangi 'Northwest North' gibi bir şey olabilir. Şimdi, benim için en belirgin çözüm her harf için '[nN]' s.Name her karakterin içinden yürümek ve yazmayı olacaktır:

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

Ama bu oldukça olmayan zarif çözüm olduğunu düşünüyoruz. Hız gerçekten bir endişe değil, başka bir yolun olup olmadığını bilmem gerek.

cevap

105

ile düzenli ifade deyimi öneki gerekebilir http://play.golang.org/p/WgpNhwWWuW

regex.

Bir normal ifadenin başına "(?i)" ekleyerek bunu yaparsınız.

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

Sabit bir düzenli ifade için böyle görünecektir.

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

bayrakları hakkında daha fazla bilgi için, dönem "bayrakları" için syntax documentation arayın.

+2

Ama bu pek çok veri varken, çok yavaş buldum. Regexp.Match içinde unicode.SimpleFold çağrılması nedeniyle, bu yüzden harfleri üst ve sonra regexp eşleştirmek için kullanarak değiştirmenizi öneririz. Bu hızdır. regexp'in -f Kod/Çatınızın 1271.94s KULLANICI ÖRNEK XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/çerçeveler görmezden '' ' #by (i?): Aşağıdaki zaman veridir 7.32s sistemi 97% işlemci 21: 54.95 toplam #By toUpper ve eşleşme XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/çerçeveler -f Kod/çerçeveler 263.87s kullanıcı 8.99s sistem 110% cpu 4 : 06.44 toplam '' ' – QJGui

20

Büyük/küçük harf duyarlı hale getirmek için modelin başına (?i) ekleyebilirsiniz.

Reference.

5

Ben Go ile çok aşina değilim ama bu örneğe göre: Sen ilk öğe olduğu gibi bir harf duyarsız bayrağı ayarlayabilirsiniz (?i)

4

i bayrağını kullanın. uç documentation alıntı:

Gruplama:

(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 

Bayrak sözdizimi xyz (grubu) ya da -XYZ (açık) ya da xyz (ayar xy, açık z) 'dir. bayraklar şunlardır:

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

Bu i, m, s ve U? –

+15

Bu cevap, belgeler kadar yardımcı değildir. Neyse ki, aşağıda çalışan bir örnek var. –

İlgili konular