web-dev-qa-db-fra.com

Comment créer une expression régulière insensible à la casse dans Go?

Maintenant, bien sûr, je pourrais écrire mon expression régulière pour gérer les deux cas, tel que regexp.Compile("[a-zA-Z]"), mais mon expression régulière est construite à partir d'une chaîne donnée par l'utilisateur:

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

s.Name est le nom. Ce qui pourrait être quelque chose comme 'North by Northwest'. Maintenant, la solution la plus apparente pour moi serait de parcourir chaque caractère de s.Name et écrivez "[nN]" pour chaque lettre:

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

Mais j'estime qu'il s'agit d'une solution plutôt non élégante. La vitesse n'est pas vraiment une préoccupation, mais j'ai besoin de savoir s'il existe un autre moyen.

68
Svip

Vous pouvez définir un indicateur insensible à la casse en tant que premier élément de l'expression régulière.

Vous faites cela en ajoutant "(?i)" au début d'une expression régulière.

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

Pour une expression rationnelle fixe, cela ressemblerait à ceci.

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

Pour plus d'informations sur les drapeaux, recherchez regexp/syntax documentation du package (ou documentation de la syntaxe ) pour le terme "flags".

140
Daniel

Vous pouvez ajouter un (?i) au début du motif pour le rendre insensible à la casse.

référence

23
Qtax

Je ne connais pas trop Go, mais selon cet exemple: http://play.golang.org/p/WgpNhwWWuW

Vous devez préfixer votre déclaration regex avec (?i)

6
Adam Plocher

Utilisez le drapeau i. Citer le conseil documentation :

Regroupement:

(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

La syntaxe du drapeau est xyz (set) ou -xyz (clear) ou xy-z (set xy, clear z). Les drapeaux sont:

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)
5
zzzz