3 votes

Regex : Toute combinaison de mots et de chiffres, mais avec un seul trait de soulignement.

Je voudrais faire correspondre une chaîne entière si elle contient des lettres ou des chiffres ou un séquence de soulignement unique donc :

Accepté :

  • H_i_there
  • _C'est_OK_.
  • _x_y_5_z
  • abddd_cdxxx

Non accepté :

  • s___2
  • __s__t__2
  • __x____x4

Les caractères de soulignement multiples et consécutifs ne sont donc pas autorisés. Comment l'expression regex se présente-t-elle pour cela ? Ma version est la suivante : ^[a-zA-Z0-9]+\_{0,1}[a-zA-Z0-9]+\_{0,1}$ Mais cela doit être récursif, d'une manière ou d'une autre, pour que cela fonctionne, et, à ma connaissance, les expressions rationnelles ne prennent pas en charge une fonctionnalité aussi complexe.

2voto

Wiktor Stribiżew Points 100073

Vous pouvez utiliser

^_?[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*_?$

Voir le Démonstration de regex

Détails :

  • ^ - début de la chaîne
  • _? - une option _
  • [a-zA-Z0-9]+ - 1+ caractères alphanumériques
  • (?:_[a-zA-Z0-9]+)* - 0+ séquences de :
    • _ - 1 trait de soulignement
    • [a-zA-Z0-9]+ - 1+ caractères alphanumériques
  • _? - une option _
  • $ - fin de la chaîne

Un modèle moins efficace, mais plus court :

^(?:_?[a-zA-Z0-9]+)*_?$

Voir cette démo .

1voto

bobble bubble Points 6095

Vous pouvez utiliser un lookahead de refuser __

^(?!.*?__)\w+$

Voir la démo à regex101

\w correspond à un mot-caractère [A-Za-z0-9_] (y compris le trait de soulignement).

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