Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/05/2023, à 11:23

alex2423

Identifier un numéro de téléphone dans une regex

Hello tout le monde,

Comment faite pour tester dans une chaine de caractère un numéro de téléphone ?
Je teste les expressions avec l'outil : https://regex101.com/

Exemple de chaine :
"Reception du colis 0611111111 au 5 rue allée de l'auberce"

Pour cet exemple, j'ai 3 parties :
- une chaine de caractère sans suite de 10 chiffres
- une suite de 10 chiffres
- une chaine de caractère sans suite de 10 chiffres

J'ai utilisé les sous groupes avec cette expression mais j'ai l'impression que ce n'est pas tout à fait çà.

(.*)([0-9]){10}(.*)

Comme on peut voir sur la capture
https://i.imgur.com/YG7m0dy.png

Je pense que le problème est qu'en faisant (.*) j'inclus n'importe quel caractère. J'ai essayé du coup d'exclure les caractères de 0 à 9 dans le sous groupe mais succès avec ([^0-9]*) mais peut être que je m'y prend mal.

Hors ligne

#2 Le 27/05/2023, à 11:41

nany

Re : Identifier un numéro de téléphone dans une regex

Bonjour,


La parenthèse fermante du deuxième groupe est mal placée.

([0-9]){10}

⇓⇓⇓⇓⇓

([0-9]{10})

Hors ligne

#3 Le 27/05/2023, à 12:33

alex2423

Re : Identifier un numéro de téléphone dans une regex

Quel idiot ! Merci bien nany.
Je complexifie un peu ma demande, un numéro de téléphone peut être une suite de 10 chiffres mais peut être espacé par un point, un espace ou un tiret
Il faut donc que je crée un couple composé de n'importe quel chiffre et en option un "-", un espace ou "." et le tout 10 fois. De plus il faut que l'on prenne l'entièreté des éléments du couple que l'on souhaite répété non pas un des éléments, on utilise donc (?: ....)   
Et donc en utilisant

((?:[0-9][ .-]?){10})

cela a l'air de fonctionner nickel smile

Hors ligne

#4 Le 27/05/2023, à 12:41

bruno

Re : Identifier un numéro de téléphone dans une regex

https://regexpattern.com/phone-number/#fr

Qui donne :

/^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$/

pour valider n'importe quel numéro de la forme :

0123456789
01 23 45 67 89
01.23.45.67.89
0123 45.67.89
0033 123-456-789
+33-1.23.45.67.89
+33 – 123 456 789
+33(0) 123 456 789
+33 (0)123 45 67 89
+33 (0)1 2345-6789
+33(0) – 123456789

Dernière modification par bruno (Le 27/05/2023, à 12:42)

#6 Le 27/05/2023, à 12:44

nany

Re : Identifier un numéro de téléphone dans une regex

Ah ben si ça existe déjà, pas la peine de se creuser les méninges.

Hors ligne

#7 Le 27/05/2023, à 12:46

bruno

Re : Identifier un numéro de téléphone dans une regex

Oui je suis une grosse feignasse et je le revendique ; surtout s'il s'agit d'écrire des regxexp wink

#8 Le 27/05/2023, à 13:03

ar barzh paour

Re : Identifier un numéro de téléphone dans une regex

bon je me lance
sans être tout à fait exact , ce pourrait être
0[1-9]([0-9]{8})

sur 10 chiffres un numéro actuel se décompose ainsi : 0 puis un chiffre de 1 à 9 puis 8 fois un chiffre entre 0 et 9
quelquechose comme
(0[1-9][0-9]{8})

maintenant si on ajoute des espaces, des points, des tirets, des soulignés, des je ne sais pas quoi ....
et pourquoi pas 0 1 2 3 4 5 6 7 8 9

1-supprimer tout ce qui n'est pas [0-9]
2-rechercher (0[1-9]([0-9]{8})


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#9 Le 27/05/2023, à 13:53

alex2423

Re : Identifier un numéro de téléphone dans une regex

bruno a écrit :

https://regexpattern.com/phone-number/#fr
Qui donne :

/^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$/

pour valider n'importe quel numéro de la forme :

Le gros défaut est que ta regex est illisible. J'ai du mal à la lire.
Je ne suis pas très bon en regex, et si on fait tout le temps des copiés collés, on ne progresse pas et on lutte toujours pour les écrire sad

nany a écrit :
( (?:[0-9]{2}  [ .-]?  ){4}[0-9]{2})

big_smile

Intéressant ta solution, les séparateurs, si il y en a, sont obligatoirement écrit entre les 4 premiers couples de chiffres et ensuite tu clôtures par le 5ème couple de chiffre (et sans séparateur)

@ar barzh paour, si on veut être plus exact, un numéro de téléphone national commence toujours par 0.
La solution de supprimer les espaces est envisageable même s'il s'agit de repérer la présence d'un numéro dans une chaine de caractère pouvant avoir des espaces mais c'est moins drôle big_smile


Si on complète la solution de nany, on n'a plus le sous ensemble "couple de chiffre + séparateur optionnel " que l'on répète 4 fois mais uniquement 3 fois et on personnalise le premier avec le séparateur optionnel

(0[1-9][ .-]? (?:[0-9]{2}[ .-]?){3} [0-9]{2})

Et donc sur l'ensemble de la chaine

(.*)(0[1-9][ .-]? (?:[0-9]{2}[ .-]?){3} [0-9]{2})(.*)

Dernière modification par alex2423 (Le 27/05/2023, à 13:54)

Hors ligne

#10 Le 27/05/2023, à 14:15

bruno

Re : Identifier un numéro de téléphone dans une regex

Le gros défaut est que ta regex est illisible. J'ai du mal à la lire.

C'était un peu le but aussi wink

Le gros défaut de ce type de regexp c'est que tu trouveras toujours un exemple de saisie (si le numéro est saisi par un utilisateur) qui ne correspond pas. Tu vas donc la complexifier au fur et à mesure (ce qui est en train de se passer dans ce fil) jusqu'à la rendre difficile à déchiffrer comme dans l'exemple que j'ai donné qui ne traite pourtant arbitrairement que de certains cas possibles.

On est presque dans le cas de le tentative de validation d'une adresse de courriel (en anglais, désolé) par regexp. Bien sûr c'est plus simple avec un numéro de téléphone de contraindre fortement la saisie (que des chiffres par exemple) pour éviter ce genre d’écueil. Si on ne maîtrise pas la sasie de l'utilisateur, c'est à mon avis, peine perdue.

#11 Le 27/05/2023, à 17:20

alex2423

Re : Identifier un numéro de téléphone dans une regex

La saisie du numéro de téléphone sera par des utilisateurs et non pas une machine mais par contre j'ai réussi à les contraindre sur le format. Comme il s'agit uniquement de numéros nationaux, je n'ai pas à me soucier du code pays. Je suis allé au plus simple.

Après entre acheter une pâtisserie toute faite chez le pâtissier ou réussir à faire une pâtisserie, pas parfaite certe, mais satisfaisante, quel plaisir smile 

Sur les regex, j'ai enfin compris l'intérêt du sous ensemble (?:  ). C'est en forgeant que l'on devient forgeront mais en effet j'ai de la chance de pouvoir imposer mes choix de format aux utilisateurs. J'ai besoin de penser qu'à un nombre limité de cas. Si le numéro de téléphone n'est pas reconnu, ils auront un petit popup de rappel.

Au sujet de la validation de l'email, c'est en effet un peu plus corsé, il n'y a pas que de l'alphanumérique, il y a également des caractères comme le "+" auquel je n'aurais pas pensé ...

Hors ligne

#12 Le 27/05/2023, à 18:16

ar barzh paour

Re : Identifier un numéro de téléphone dans une regex

hello  (à oublier)

alex2423 a écrit :

@ar barzh paour, si on veut être plus exact, un numéro de téléphone national commence toujours par 0.

j'ai indiqué
sans être tout à fait exact , ce pourrait être
(0[1-9]([0-9]{8}) , indiquant que le numéro commençait par 0 ce qui n'est pas tout à fait exact (et oui/et non  mais c'est très anecdotique)
un numéro est de la forme E Z AB PQ MCDU
E étant l'opérateur choisit pour émettre l'appel
0 étant l'opérateur par défaut
ce code E doit être supprimé si on utilise le code du pays
exemple pour la france
+33 Z AB PQ MCDU

(0[1-9]([0-9]{8}) soit commence toujours par "0" suivi d'un chiffre entre 1 et 9 suivi de 0 à 9 8 fois


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne