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?
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.
À 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).
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.