web-dev-qa-db-fra.com

Javascript + Regex = Rien à répéter erreur?

Je suis nouveau chez Regex et j'essaie de l'intégrer dans l'un de mes nouveaux projets pour voir si je peux l'apprendre et l'ajouter à mon répertoire de compétences. Cependant, je frappe un barrage routier ici.

J'essaie de voir si l'entrée de l'utilisateur contient des caractères illégaux en utilisant le .search fonctionne comme suit:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
    ...
}

Cependant, lorsque j'essaie d'exécuter la fonction, cette ligne la contient, elle renvoie l'erreur suivante pour cette ligne spécifique:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.

]/: Nothing to repeat

Je ne peux pas pour la vie de moi voir ce qui ne va pas avec mon code. Est-ce que quelqu'un peut-il me montrer la bonne direction?

59
esqew

Vous devez doubler les barres obliques inverses utilisées pour échapper aux caractères spéciaux d'expression régulière. Cependant, comme le souligne @Bohemian, la plupart de ces barres obliques inverses ne sont pas nécessaires. Malheureusement, sa réponse souffre du même problème que la vôtre. Ce que vous voulez vraiment, c'est:

La barre oblique inverse est interprétée par le code qui lit la chaîne, plutôt que transmise à l'analyseur d'expressions régulières. Tu veux:

"[\\[\\]?*+|{}\\\\()@.\n\r]"

Notez la barre oblique inverse quadruplée. C'est absolument nécessaire. La chaîne transmise au compilateur d'expressions régulières est alors identique à la chaîne de @ Bohemian et fonctionne correctement.

80
andrewdski

À partir de @Bohemian, je pense que l'approche la plus simple serait d'utiliser simplement un littéral d'expression régulière, par exemple:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
    // ... stuff ...
}

Les littéraux d'expression régulière sont agréables car vous n'avez pas à échapper au caractère d'échappement, et certains IDE mettront en évidence les expressions rationnelles invalides (très utiles pour moi car je les bousille constamment).

7
NobodyMan

Tout d'abord, dans une classe de caractères [...]la plupart les caractères n'ont pas besoin d'être échappés - ce ne sont que des littéraux.

Donc, votre regex devrait être:

"[\[\]?*+|{}\\()@.\n\r]"

Cela compile pour moi.

2
Bohemian