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.
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