118 votes

Comment faire une expression régulière insensible à la casse en Go ?

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

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

s.Name est le nom. Qui pourrait être quelque chose comme "North by Northwest". Maintenant, la solution la plus évidente pour moi serait de passer en revue chaque personnage 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 je pense que c'est une solution peu élégante. La vitesse n'est pas vraiment un problème, mais j'ai besoin de savoir s'il existe un autre moyen.

232voto

Daniel Points 9676

Vous pouvez définir un drapeau insensible à la casse comme premier élément de la regex.

Pour ce faire, vous devez ajouter "(?i)" au début d'une expression rationnelle.

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

Pour une regex fixe, cela ressemblerait à ceci.

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

Pour plus d'informations sur les drapeaux, consultez le site regexp/syntax documentation du paquet (ou le documentation syntaxique ) pour le terme "drapeaux".

43voto

Qtax Points 20487

Vous pouvez ajouter un (?i) au début du motif pour qu'il ne soit pas sensible à la casse.

Référence

11voto

Adam Plocher Points 6313

Je ne suis pas trop familier avec le Go, mais d'après cet exemple : http://play.golang.org/p/WgpNhwWWuW

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

6voto

zzzz Points 23017

Utilisez le i drapeau. Citation du conseil documentation :

Groupement :

(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 (fixer) ou -xyz (effacer) ou xy-z (fixer xy, effacer 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X