Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/09/2012, 10h51   #1
Kawabaumga
Membre actif
 
Développeur informatique
Inscription : avril 2010
Messages : 171
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2010
Messages : 171
Points : 163
Points : 163
Par défaut Matcher une série de chiffre précise

Bonjour,
Je me permets de venir à vous afin d'optimiser une regexp.
Je cherche à matcher les suite de chiffre se composant de la façon suivante:
Groupe 1:
- 02 + 7digits (sauf 022)
- 03 + 7digits (sauf 032)
- 04 + 7digits (sauf 042)
- 08 + 7digits (sauf 082)
- 09 + 7digits (sauf 092)

Groupe 2:
- 072 + 7digits
- 073 + 7digits
- 074 + 7digits
- 076 + 7digits
- 077 + 7digits
- 050 + 7digits
- 052 + 7digits
- 053 + 7digits
- 054 + 7digits
- 055 + 7digits
- 057 + 7digits
- 058 + 7digits

De plus, chaque préfixe ne peut pas être suivit d'un 0 ou d'un 1.

La requête ^(02|03|04|08|09)[3-9].{6}$ me permet de matcher le groupe 1.
La requête ^(050|052|053|054|055|057|058|072|073|074|076|077)[2-9].{7}$me permet de matcher le groupe 2.

Est-il possible d'améliorer ses deux requêtes et surtout est-il possible de ne faire qu'une seule et même requête pour matcher l'ensemble des deux groupes?

Cordialement,
Julien

EDIT: la requête ^((02|03|04|08|09)[3-9]|(050|052|053|054|055|057|058|072|073|074|076|077)[2-9]).{6}$semble faire l'affaire mais.. ya-til possibilité de l'améliorer?
Kawabaumga est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 03h45   #2
CosmoKnacki
Membre habitué
 
Avatar de CosmoKnacki
 
Homme
Inscription : mars 2009
Messages : 106
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2009
Messages : 106
Points : 129
Points : 129
Bonjour,
tu peux améliorer en factorisant un peu plus (ie: le zéro est commun à tous tes nombres par exemple), en utilisant les classes de caractères prédéfinies (\d), voire les intersections de classes si c'est plus court que d'énumérer tous les éléments ([\d&&[^2]]=tous les chiffres sauf 2)

Code :
^0([23489][\d&&[^2]]|(5[0234578]|7[23467])\d)\d{6}$
mais si tu n'as que des nombres et pas d'autres caractères du tout, tu peux faire plus court:

Code :
^0([23489][^2]|(5[^169]|7[23467]).).{6}$
Aprés tu peux encore optimiser sachant que la regex est analysée de gauche à droite. Si par exemple tu sais à l'avance que les nombres en 05 et 07 sont plus courants, tu peux inverser :

Code :
^0((5[^169]|7[23467]).|[23489][^2]).{6}$
CosmoKnacki est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h23.


 
 
 
 
Partenaires

Hébergement Web