112 votes

Que signifie l'erreur "Rien à répéter" lors de l'utilisation d'une expression rationnelle en javascript ?

Je suis novice en matière de Regex et j'essaie de l'intégrer à l'un de mes nouveaux projets pour voir si je peux l'apprendre et l'ajouter à mon répertoire de compétences. Cependant, je me heurte à un obstacle.

J'essaie de voir si la saisie de l'utilisateur contient des caractères illégaux en utilisant la fonction .search fonctionnent ainsi :

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

Cependant, lorsque j'essaie d'exécuter la fonction contenue dans cette ligne, je reçois l'erreur suivante pour cette ligne spécifique :

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

]/: Nothing to repeat

Je n'arrive pas à voir ce qui ne va pas dans mon code. Quelqu'un peut-il m'indiquer la bonne direction ?

148voto

andrewdski Points 2246

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

La barre oblique inverse est interprétée par le code qui lit la chaîne, au lieu d'être transmise à l'analyseur d'expressions régulières. Vous voulez :

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

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

9voto

NobodyMan Points 860

En m'appuyant sur @Bohemian, je pense que l'approche la plus simple serait d'utiliser un littéral regex, par exemple :

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

Les caractères littéraux des regex sont intéressants parce qu'il n'est pas nécessaire d'échapper le caractère d'échappement, et certains IDE mettent en évidence les regex invalides (ce qui m'est très utile car je les foire constamment).

8voto

Pour les voyageurs de Google : ce message d'erreur stupide et inutile est également affiché lorsque vous faites une faute de frappe et que vous doublez le champ + opérateur regex :

D'accord :

\w+

Pas d'accord :

\w++

2voto

Bohemian Points 134107

Premièrement, dans une classe de caractères [...] le plus n'ont pas besoin d'être échappés - ce sont simplement des caractères littéraux.

Ainsi, votre expression rationnelle devrait être :

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

Cela compile pour moi.

2voto

Aneeq Ahmad Points 41

Dans mon cas, j'ai dû tester un numéro de téléphone à l'aide d'une expression rationnelle, et j'ai obtenu la même erreur,

Invalid regular expression: /+923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/: Nothing to repeat'

Dans mon cas, l'erreur était donc la suivante + après l'opérateur / au début de l'expression rationnelle. Ainsi, en enfermant le + opérateur avec crochets [+] et en envoyant à nouveau la demande, cela a fonctionné comme un charme.

Les éléments suivants fonctionneront :

/[+]923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/

Cette réponse peut être utile à ceux qui ont obtenu le même type d'erreur, mais leurs chances d'obtenir l'erreur de ce point de vue sont les mêmes que les miennes ! Merci :)

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