4 votes

Le jeton précédent n'est pas quantifiable

J'ai une expression régulière de nom d'utilisateur comme ceci :

/^(?=.{5,32}$)(?![1-9_])(?!.*_{2})\w+(?<!_)$/gm

A propos de regexp :

  1. Le premier caractère est une lettre.
  2. Vous ne pouvez pas utiliser deux traits de soulignement à la suite.
  3. Il ne peut y avoir de trait de soulignement à la fin.
  4. Les personnages [a-zA-Z0-9_] ( \w ) sont autorisés.
  5. 5 à 32 caractères

Je ne peux pas l'utiliser dans Go à cause de lookahead et lookbehind.

Le jeton précédent n'est pas quantifiable

Question :

Comment simuler ces lookahead et lookbehind dans Go Regexp pour que cela fonctionne ?

3voto

Wiktor Stribiżew Points 100073

Tout d'abord, il semble que vous puissiez remanier le modèle pour l'utiliser en JavaScript : /^(?=.{5,32}$)[^\W0-9_][^\W_]*(?:_[^\W_]+)*$/ , voir le Démonstration de regex .

Maintenant, il est facile de le convertir en Go, avec deux contrôles distincts : 1) la longueur de l'agitation peut être vérifiée sans regex, 2) la vérification du modèle global peut être faite avec la partie regex de JS consommée :

package main

import (
    "fmt"
    "regexp"
    "unicode/utf8"
)

func main() {
    s := "abc_123def"
    whole_cond := regexp.MustCompile(`^[^\W0-9_][^\W_]*(?:_[^\W_]+)*$`)
    pass_len := utf8.RuneCountInString(s)
    fmt.Println(whole_cond.MatchString(s) && pass_len >= 5 && pass_len <= 32)
}

Voir le Démonstration .

Détails de la Regex

  • ^ - début de la chaîne
  • [^\W0-9_] - tout caractère de mot sauf un chiffre ASCII et _
  • [^\W_]* - 0+ word chars mais _
  • (?:_[^\W_]+)* - zéro ou plusieurs occurrences de
    • _ - _ char
    • [^\W_]+ - 1+ chars de mots sauf _
  • $ - fin de la chaîne

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