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))
Où 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.
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".
Vous pouvez ajouter un (?i)
au début du motif pour le rendre insensible à la casse.
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)
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)