web-dev-qa-db-fra.com

Javascript expression régulière conditionnelle if-then-else

J'essaie de limiter les entrées à un format spécifique.

Si l'entrée a 5500 ou 5100 comme 01\01-5500-000-00, je veux avoir ceci:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$

Mais si l'entrée a autre chose que 5500 ou 5100, je veux avoir ceci:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$

Comment cela peut-il être accompli avec l'idée si alors autrement?

12
user974061

La syntaxe d'expression régulière conditionnelle n'est pas prise en charge par le moteur d'expression régulière JavaScript, mais elle peut être contournée avec un groupe non capturant contenant 2 alternatives:

  1. Un avec une perspective positive et

  2. La seconde avec une perspective inversée et négative.

Cette expression régulière répond à vos critères et est compatible JavaScript:

^(?:(?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}-[0-9]{4}-[0-9]{3}-|(?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2})$

Voir démo regex

Permettez-moi de le décomposer:

  • ^ - Début de chaîne
  • (?:
    • (?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}-[0-9]{4}-[0-9]{3}- - Première alternative avec le (?=.*\b5[15]00\b) anticipation qui nécessite un mot entier 5500 ou 5100 à l'intérieur de la chaîne et le premier motif que vous avez
    • | - opérateur d'alternance
    • (?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}-[0-9]{4}-[0-9]{3}-[0-9]{2}) - Deuxième alternative précédée du (?!.*\b5[15]00\b) anticipation négative qui garantit l'absence de 5100 ou 5500 à l'intérieur de la chaîne, et ne correspond alors qu'à votre deuxième modèle.
  • $ - fin de chaîne.
14
Wiktor Stribiżew

Remplacez cette partie du motif [0-9]{4} avec les valeurs littérales pour 5100/5500:

/^\d{2,}\\\d{2}-(?:5[15]00-\d{3}-|(?!5[15]00)\d{4}-\d{3}-\d{2})$/
  • [0-9] est la même chose que \d en JavaScript
  • Pour la partie else, utilisez le lookahead négatif(?!5[15]00)\d{4} pour garantir que ce n'est pas 5100/5500.
2
Mariano

Utilisez les conditions , par exemple:

(? (? = regex) puis | else) : [0-9]{2,}\\[0-9]{2}\-(?(?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-[0-9]{3}\-[0-9]{2})

Exemple de conditions regex: [email protected]

Dans le cas où vous utilisez un regex moteur qui n'est pas basé sur PCRE, vous pouvez imiter la fonctionnalité en procédant comme suit:

((?=positive-regex-statement)then|(?!negavite-regex-statement)then)

Par exemple.

^[0-9]{2,}\\[0-9]{2}\-((?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-|(?!5[15]00)[0-9]{4}\-[0-9]{3}\-[0-9]{2})$

Exemple de conditions de regex mimiques: [email protected]

2
Eder