Je travaille en angulaire 7 et je valide le numéro de contact à l'aide de l'expression régulière
registerForm = this.fb.group(
{
email:['', [Validators.required, Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+.com$')]],
contact:['',[Validators.required, Validators.pattern('/^(?!(\d)\1+$)(?:\(?\+\d{1,3}\)?[- ]?|0)?\d{10}$/')]],
password:['',[Validators.required]],
confirmPassword:['',[Validators.required]]
},{ validator: PasswordMatchValidator });
mais cela renvoie l'erreur suivante: L'analyse du module a échoué: littéral octal en mode strict (10: 76)
J'ai déjà essayé \\ au lieu de \ car d'après ma découverte, le problème est avec \ .
"^(?!(\d)\1+$)(?:\(?\+\d{1,3}\)?[- ]?|0)?\d{10}$"
Existe-t-il un moyen de remplacer le caractère \ pour le faire fonctionner?
4 Réponses :
Les expressions régulières suivantes vous permettront de faire correspondre ou de remplacer des barres obliques inverses:
/ \\ / //(1) correspond à une barre oblique inverse (la première occurrence uniquement)
/ \\ / g //(2) correspond à toute occurrence de barre oblique inverse (recherche globale)
re1 = new RegExp ("\\\\", "")// identique à (1), avec le constructeur RegExp
re2 = new RegExp ("\\\\", "g")// identique à (2), avec le constructeur RegExp
basé sur cet article .
Selon les docs Angular, le code Validators.pattern > méthode accepte la chaîne | RegExp . Dans votre cas, il convertit la chaîne en RegExp avant de l'utiliser. Par conséquent, vous auriez besoin de \\\\ barres obliques inverses pour obtenir une barre oblique inverse \ régulière.
J'ai essayé \\\\ mais cela n'a pas fonctionné pour moi ... alors que je ne pouvais malheureusement pas comprendre le sens de l'article.
@Mariah Il semble que votre deuxième motif présente des problèmes, veuillez supprimer / du début et de la fin de '/ ^ (?! (\ D) \ 1 + $) (?: \ ( ? \ + \ d {1,3} \)? [-]? | 0)? \ d {10} $ / '. Le caractère / n'est pas requis comme expliqué dans ceci a > Question SO.
Il y a quelques problèmes ici mais je commencerais par celui-ci: le caractère / est utilisé pour commencer et terminer un littéral RegExp en javascript, ce n'est pas ' t une partie du motif. Vous ne devriez pas le mettre entre guillemets (en tant que chaîne littérale) car angular essaiera de manière incorrecte de créer un modèle qui inclut les / s.
Au lieu de:
Validators.pattern ('/ ^ (?! (\ d) \ 1 + $) (?: \ (? \ + \ d {1,3} \)? [-]? | 0) ? \ d {10} $ / ')
Supprimez votre chaîne de guillemets simples:
Validators.pattern (/ ^ (?! (\ d) \ 1 + $) (?: \ (? \ + \ d {1,3} \)? [-]? | 0)? \ d {10} $ /)
Je suis à peu près sûr que ce n'est toujours pas l'expression régulière que vous voulez , il semble que vous échappiez des parenthèses que vous ne devriez pas être, mais c'est au moins valide.
D'où avez-vous obtenu le motif à l'origine? Si vous partagez cela, nous pourrons peut-être régler le problème ou essayer de jouer sur https://regexr.com et lorsque vous obtenez le bon motif, copiez-le simplement comme vous le voyez là-bas, sans guillemets ni échappements supplémentaires.
(De manière déroutante, Validators.pattern accepte également les chaînes , mais si vous voulez passer une chaîne, vous devez omettre le / , car ces barres obliques ne font pas réellement partie du modèle, et vous devez également omettre ^ et $ lorsque vous passez une chaîne car Angular les ajoute automatiquement )
Remarque: la validation des numéros de téléphone avec regex est probablement une mauvaise idée de toute façon. Google libphonenumber
Il s'agit d'un problème X-Y . Tout le monde se concentre sur le titre de votre question d'origine, qui demandait d'échapper au littéral \ dans une expression régulière. Ce n'est pas le problème.
Premièrement, en JavaScript, les nombres peuvent être représentés de plusieurs façons. L'une d'elles est la notation littérale octale, indiquée par le préfixe d'un nombre (code de caractère) avec un \.
Votre regex contient \ 1 qui est interprété comme un octal , qui est votre message d'erreur. Les séquences d'échappement octales ont été obsolètes , c'est pourquoi strictmode génère une erreur, qui est le problème réel auquel vous êtes confronté.
Si vous avez résolu l'erreur de compilation en échappant votre \ 1 comme \\ 1 , vous avez généré cette expression qui exécute une anticipation négative de tout chiffre unique, suivi d'un caractère littéral "\", suivi du nombre "1" un nombre quelconque de fois .
Vous remarquerez également que les parenthèses d'indicatif régional sont facultatives, mais elles nécessitent un code littéral + > (parce qu'il est échappé comme \ + ) après le crochet ouvrant. Ce n'est certainement pas ce que vous voulez.
Le regex que vous voulez est probablement le une des réponses à cette question
"^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$"
qui analyse ceci
Deuxièmement, Angular's PatternValidator convertit une chaîne en une expression régulière, il suffit donc de passer une chaîne sans la mettre entre crochets avec des barres obliques.
Cela est utile pour trouver un modèle de travail, mais (ironiquement compte tenu de votre critique d'ouverture), vous venez d'oublier de traiter les contre-obliques qui s'échappent (pas dans le modèle mais dans la chaîne), ce que vous auriez besoin de faire lorsque vous passez ce modèle en tant que une chaîne littérale. Validators.pattern ('(\\ + \\ d {1,2} \\ s)? \\ (? \\ d {3} \\)? [\\ s .-]? \ \ d {3} [\\ s .-]? \\ d {4} ') Ou (neater IMO) Validators.pattern (/ ^ (\ + \ d {1,2 } \ s)? \ (? \ d {3} \)? [\ s .-]? \ d {3} [\ s .-]? \ d {4} $ /)
En effet, l'erreur octale est vue précisément parce que le \ 1 n'a pas été correctement échappé vers \\ 1 à l'intérieur d'une chaîne littérale. Cela aurait abouti à un \ 1+ dans le modèle d'expression régulière, qui n'est pas un littéral 1 répété mais une répétition du premier groupe correspondant.
En fait, vous pouvez utiliser \ 1 si vous utilisez une déclaration littérale (sans guillemets)
const regex = /someregex\1/gm;
veuillez clarifier: j'ai déjà essayé \ au lieu de \
Je pense qu'il voulait dire: j'ai essayé
\\au lieu de\.À quoi sert le
\ 1? C'est ce qu'il interprète comme un octal (à cause du `\` avant un nombre). Voir mathiasbynens.be/notes/javascript-escapes#octal Je suppose que vous devriez simplement supprimer cette.@Rov ... Merci, cela a fonctionné: \\ au lieu de \ et en supprimant la délimitation ...
Je suis content que cela ait fonctionné!