Alphanumérique, tiret et trait de soulignement, mais pas d'espaces, vérification des expressions régulières JavaScript

92

Essayer de vérifier l'entrée par rapport à une expression régulière.

Le champ ne doit autoriser que les caractères alphanumériques, les tirets et les traits de soulignement et ne doit PAS autoriser les espaces.

Cependant, le code ci-dessous autorise les espaces.

Qu'est-ce que je rate?

var regexp = /^[a-zA-Z0-9\-\_]$/;
var check = "checkme";
if (check.search(regexp) == -1)
    { alert('invalid'); }
else
    { alert('valid'); }
À M
la source
5
J'aime la réponse d'Andy E ci-dessous. En outre, vous voudrez peut-être consulter gskinner.com/RegExr pour une modification rapide des expressions régulières . C'est ... plutôt gentil.
pixelbobby

Réponses:

155

Cependant, le code ci-dessous autorise les espaces.

Non, ce n'est pas le cas. Cependant, il ne correspondra qu'à une entrée d'une longueur de 1. Pour les entrées d'une longueur supérieure ou égale à 1, vous devez +suivre la classe de caractères:

var regexp = /^[a-zA-Z0-9-_]+$/;
var check = "checkme";
if (check.search(regexp) === -1)
    { alert('invalid'); }
else
    { alert('valid'); }

Notez que ni le -(dans ce cas) ni le _besoin de s'échapper.

Andy E
la source
16

Vous ne devez pas utiliser String.match mais RegExp.prototype.test (c'est-à-dire /abc/.test("abcd")) au lieu de String.search () si vous n'êtes intéressé que par une valeur booléenne. Vous devez également répéter votre classe de personnage comme expliqué dans la réponse d'Andy E:

var regexp = /^[a-zA-Z0-9-_]+$/;
saphte
la source
8
En fait, vous devriez utiliser la RegExp.prototype.testméthode si vous n'êtes intéressé que par un booléen.
Andy E
7

Cette syntaxe est un peu plus concise que les réponses qui ont été postées jusqu'à présent et aboutit au même résultat:

let regex = /^[\w-]+$/;
Grant Humphries
la source
1
Pensez à ajouter une note indiquant que votre réponse fonctionne également pour les caractères internationaux. Je ne suis pas sûr en JavaScript, mais en bash cela fonctionne: ʻecho "abc-def däf_ghi" | egrep -wo '(\ w | - | _) +'
Ivan Ogai
4

Vous avez une erreur stupide. Alors postez ici, si quelqu'un le trouve utile

  1. -\._ - signifie trait d'union, point et trait de soulignement
  2. \.-_ - signifie tous les signes compris entre le point et le trait de soulignement
Ivan Ivanov
la source
# 2 ne s'applique que s'il est entre crochets, c'est-à-dire que [\.-_] Est un caractère compris entre le point et le soulignement. Mais sans les crochets, les deux sont une séquence de trois symboles, et ils diffèrent simplement dans l'ordre.
érict le
1

N'échappez pas au trait de soulignement. Cela pourrait causer un peu de mal.

David Fells
la source
1
Pourquoi dites vous cela? Je sais que le trait de soulignement n'a pas besoin d'être échappé, mais je n'ai jamais entendu parler de \_problèmes, en JavaScript ou dans toute autre saveur regex.
Alan Moore
1
Pure spéculation. L'expression avait l'air bien autrement et ne devrait en aucun cas correspondre aux espaces, mais je l'ai juste jetée là-bas. Cela aurait probablement dû être un commentaire et non une réponse.
David Fells
1

Essaye ça

"[A-Za-z0-9_-]+"

Devrait autoriser les traits de soulignement et les tirets

Akash Yellappa
la source
Votre solution m'a aidé. Merci!
Saiyan Prince le
0

essayez celui-ci, cela fonctionne très bien pour moi.

"^([a-zA-Z])[a-zA-Z0-9-_]*$"
Santosh Shinde
la source