-2
votes

Expression régulière: 10 chiffres avec Dash sur la position 3,4 ou 5

im essayant de vérifier un inputfield avec une expression régulière. L'utilisateur peut entrer un numéro à 10 chiffres pouvant contenir un tiret sur la position 3,4 ou 5. Lorsque j'utilise une seule expression, cela fonctionne, mais je ne peux pas l'obtenir pour travailler avec des déclarations ou des déclarations. Offense ce serait une solution pour couper tous les tirets, mais je voudrais le faire de cette façon.

Exemples qui doivent être autorisés P>

(^d{10}$)|
(^d{2}\-d{8}$)|
(^d{3}\-d{7}$)|
(^d{4}\-d{6}$)


3 commentaires

Dans quel langage de programmation vous travaillez?


Vous avez oublié d'échapper au d s. d correspond au caractère littéral d . Pour correspondre à un chiffre, utilisez \ d . Corrigez cela et votre modèle fonctionne.


^ (?: \ d {10} | \ d {2} - \ d {8} | \ d {3} - \ d {7} | \ d {4} - \ D {6}) $


3 Réponses :


-1
votes

Vous avez juste oublié de mettre les backs-backslashes devant le D. Cette regex devrait le faire:

(^\d{10}$)|(^\d{2}\-\d{8}$)|(^\d{3}\-\d{7}$)|(^\d{4}\-\d{6}$)


8 commentaires

S'il vous plaît drapeau / voter pour fermer les questions causées par des fautes de frappe - elles sont hors tension et n'ont aucune chance d'être de valeur pour les futurs lecteurs


Une version plus courte de la rédaction de la regex serait (^ \ d {10} $) | (^ \ d {2,4} \ - \ d + $)


Cela correspondrait au 0123-4567890123456


@Certeperformance: thx pour l'entrée, corrigé que: (^ \ d {10} $) | (^ \ d {2,4} \ - \ d {6,8} $)


Qui correspondra au 01-234567


Votre deuxième regex devrait utiliser un lookahead ^ \ d {10} $ | ^ (? = [\ D -] {11} $) \ d {2,4} \ - \ d + $


@revo: C'est la version la plus élégante postée ici, merci. Cela devrait être la solution à mon avis.


Vous pouvez même retirer le premier côté de l'alternance: ^ (? = (\ D * \ d) {10} $) \ d {2,4} --? \ d + $



0
votes

Essayez ce motif (? = \ d {2,4} - \ d {6,8}) ^ [\ d -] {11} $

Il utilise un lookahead positif: (? = \ d {2,4} - \ d {6,8} - \ d {6,8}) pour assurer que ce qui suit est:

\ d {2,4} - 2 jusqu'à 4 chiffres

- - Dash littéralement

\ d {6,8} - 6 à 8 chiffres

Cela garantit que vous aurez du tiret au 2e, 3ème, 4ème position.

Si cela est satisfait, que correspondance: ^ - début d'une chaîne, [\ d -] {11} - onze caractères (chiffres ou tiret), < Code> $ - fin d'une chaîne

Demo

Mise à jour : (? (? = \ d {2,4} - \ D {6,8}) ^ [\ d -] {11} $ | ^ ^ D {10} $)

Cette alternance est satisfaite - si elle est satisfaite, elle correspond à des chiffres avec DASH, si je ne le casse pas, il correspond à la motif ^ \ d {10} $ , qui correspond à dix chiffres seulement.


3 commentaires

Avez-vous utilisé le cluster conditionnel (? (...) ... exprès?


@revo Oui, afin de correspondre à différents modèles basés sur le résultat de Lookahead.


Même tous les moteurs populaires ne soutiennent pas les conditionnels et nous ne sommes pas au courant de ce que l'utilisation de la saveur de Regex utilise. Et ici, vous n'avez pas besoin de conditionnels du tout (? = \ D {2,4} - \ d {6,8}) ^ [\ d -] {11} $ | ^ \ d {10} $ $ fonctionne bien.



1
votes

Vous pouvez utiliser cette regex avec un lookahead et Alternationn: xxx

Démo de regex

Détails du regex:

  • ^ (?: : Commencez par un groupe non capturant
    • \ d {10} : correspond à tous les 10 chiffres
    • | : ou
    • (? = [\ d -] {11} $) : Assurez-vous que la longueur totale est 11 incluant -
    • \ d {2,4} - \ d + : Assurez-vous que - est à 3ème, 4ème ou 5e positions
    • ) $ : fin de groupe non capturant à la fin

      Comme Revo suggéré ci-dessous une version plus courte peut être: xxx


2 commentaires

C'est la réponse courte la plus lisible. +1. Mes deux cents pour une expression plus courte ^ (? = (?: - -? \ D) {10} $) \ D {2,4} -? \ D + $


Merci@revo: ^ (? = (?: - -? \ D) {10} $) \ d {2,4} --? \ d + $ est vraiment plus court qu'il faut presque 4 fois plus de plus pas. Mais op doit utiliser cette version plus courte si elle n'utilise pas RegEx sur un grand ensemble d'entrées.