2013-03-10 1 views
53

Teraz, oczywiście, mogę napisać wyrażenie regularne do obsługi obu przypadkach, takich jak regexp.Compile("[a-zA-Z]"), ale moje wyrażenie regularne jest wykonana z ciągiem określonym przez użytkownika:Jak zrobić wyrażenie regularne niewrażliwe na wielkość liter w programie Go?

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

Gdzie s.Name to nazwa. Które może być coś w stylu "North by Northwest". Teraz, najbardziej oczywiste rozwiązanie byłoby mi przejść przez każdego charakteru s.Name i napisać „[nN]” dla każdej litery:

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

Ale czuję, że to jest raczej non-eleganckie rozwiązanie. Prędkość nie jest tak naprawdę problemem, ale muszę wiedzieć, czy jest inny sposób.

Odpowiedz

105

Można ustawić flagę bez uwzględniania wielkości liter jako pierwszy element wyrażenie regularne.

Robisz to dodając "(?i)" na początku wyrażeń regularnych.

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

Dla sztywnego wyraŜenia regularnego wyglądałoby to tak.

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

Aby uzyskać więcej informacji na temat flag, przeszukać syntax documentation terminu „flagi”.

+2

Ale znalazłem to zbyt wolno, gdy istnieje wiele danych. Z powodu wywołania unicode.SimpleFold w regexp.Match, więc sugeruję zmianę liter na upper, a następnie użycie regexp do dopasowania. To jest szybkość. Poniżej podano dane razem: (? I) '' ' #By regexp ignorowanie wielkości liter XCMP/bin/otacmp -f -o BSP_2.2.0.html BSP/ram -f Kod/ram 1271.94s użytkownik System 7.32s 97% procesor 21: 54,95 łącznie #By doUpper i dopasuj XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/frameworks -f Kod/framework 263.87s użytkownik 8.99s system 110% procesor 4 : 06.44 łącznie '' ' – QJGui

20

Możesz dodać (?i) na początku wzorca, aby uczynić go niewrażliwym na wielkość liter.

Reference.

4

Użyj flagi i. Cytowanie końcówkę documentation:

ugrupowanie:

(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 

składni flaga jest XYZ (SET) lub -x -y -z (wyraźne), albo XYZ (zestaw XY, klarowny Z). Flagi są:

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

Gdzie w kodzie powinienem umieścić te i, m, s i U? –

+15

Ta odpowiedź jest równie nieprzydatna, co dokumentacja. Na szczęście poniżej jest działający przykład. –