2013-03-10 4 views
53

Ora, naturalmente, ho potuto scrivere la mia espressione regolare per gestire entrambi i casi, come regexp.Compile("[a-zA-Z]"), ma la mia espressione regolare è costruito da una stringa dato dall'utente:Come faccio un'espressione regolare senza distinzione tra maiuscole e minuscole in Go?

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

Dove s.Name è il nome. Quale potrebbe essere qualcosa come "North by Northwest". Ora, la soluzione più evidente per me sarebbe quella di camminare attraverso ogni carattere di s.Name e scrivere '[nn]' per ogni lettera:

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

Ma sento che questo è un piuttosto non-soluzione elegante. La velocità non è davvero una preoccupazione, ma ho bisogno di sapere se c'è un altro modo.

risposta

105

È possibile impostare un flag case-insensitive, come il primo elemento la regex.

L'operazione viene eseguita aggiungendo "(?i)" all'inizio di un'espressione regolare.

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

Per una regex fissa sarebbe simile a questa.

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

Per ulteriori informazioni sui flag, cercare l'syntax documentation per il termine "bandiere".

+2

ma ho trovato questo è troppo lento, quando ci sono molti dati. A causa del richiamo di unicode.SimpleFold in regexp.Match, quindi suggerisco di cambiare le lettere in upper e di usare regexp in modo che corrisponda. Questa è la velocità. Ciò che segue è il tempo di dati: (? I) '' ' #By regexp di ignorare caso XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/quadri -f Codice/quadri 1271.94s utente Sistema 7.32s 97% CPU 21: 54.95 totale #By toUpper and match XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/framework -f Codice/framework 263.87s utente 8.99s sistema 110% cpu 4 : 06.44 totale '' ' – QJGui

20

È possibile aggiungere un (?i) all'inizio del modello per renderlo non sensibile al maiuscolo/minuscolo.

Reference.

4

Utilizzare il flag i. Citando la punta documentation:

raggruppamento:

(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 

sintassi Flag è xyz (set) o -xyz (trasparente) o xyz (xy impostare, cancellare z). Le bandiere sono:

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

Dove nel codice dovrei inserire questi i, m, se U? –

+15

Questa risposta non è di aiuto come la documentazione. Per fortuna, c'è un esempio di lavoro qui sotto. –

Problemi correlati