Expression régulière
blux
Messages postés
2045
Date d'inscription
Statut
Modérateur
Dernière intervention
-
khalilamk Messages postés 2 Statut Membre -
khalilamk Messages postés 2 Statut Membre -
Bonjour,
j'ai une expression régulière dont je voudrais récupérer quelques éléments.
J'utilise pour cela les variables $.
Mais je n'arrive pas à trouver un schéma cohérent pour le cas où un de mes pattern possède un OR.
Je m'explique, soit une suites de chaines :
TOTO 02.01.13 MAISON-1
TITI NODATE BOULOT-2
...
Je veux récupérer soit la date (pour la mettre en format frenchy, alors qu'elle est en british) soit l'absence de DATE, ainsi que le champ qui suit.
J'ai donc une ER qui ressemble à ça :
/(\w{6})( )((\d{2})(\.)(\d{2})(\.)(\d{2})|(NODATE))( )(\w+)(-)(.+)/
Le problème est qu'en fonction ce qui matche, mes variables $ ne sont pas les mêmes.
Y-a-t-il une astuce pour que ce soit toujours les mêmes ?
Pour l'instant j'ai fait un double test, mais c'est pas le truc le plus joli...
Merci d'avance à ceux qui se sentent inspirés.
--
A+ blux
j'ai une expression régulière dont je voudrais récupérer quelques éléments.
J'utilise pour cela les variables $.
Mais je n'arrive pas à trouver un schéma cohérent pour le cas où un de mes pattern possède un OR.
Je m'explique, soit une suites de chaines :
TOTO 02.01.13 MAISON-1
TITI NODATE BOULOT-2
...
Je veux récupérer soit la date (pour la mettre en format frenchy, alors qu'elle est en british) soit l'absence de DATE, ainsi que le champ qui suit.
J'ai donc une ER qui ressemble à ça :
/(\w{6})( )((\d{2})(\.)(\d{2})(\.)(\d{2})|(NODATE))( )(\w+)(-)(.+)/
Le problème est qu'en fonction ce qui matche, mes variables $ ne sont pas les mêmes.
Y-a-t-il une astuce pour que ce soit toujours les mêmes ?
Pour l'instant j'ai fait un double test, mais c'est pas le truc le plus joli...
Merci d'avance à ceux qui se sentent inspirés.
--
A+ blux
"Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
2 réponses
-
Bonjour,
Je ne suis pas vraiment expert en expression régulière, je les utilise un peu en Java mais on peut faire des trucs en plus donc je ne sais pas trop ce qui est correct dans le langage que tu utilises... en particulier je ne comprends pas trop ta phrase "mes variables $ ne sont pas les mêmes"
Bref, moi je ferais quelque chose comme ça :
\w+\s(\d{2}\.\d{2}\.\d{2}|NODATE)\s(.+)
Remarque : je mettrais aussi {1,2} à la place de {2}, au cas où le 0 ait été omis.-
"mes variables $ ne sont pas les mêmes"
Quand on travaille avec des ER, il y a toute une série de variables implicites qui représentent ce qui a 'matché' dans l'ER.
Elles s'appellent $1, $2, $3... $n.
Ici, dans ma première chaine, le mois peut être récupéré dans $3 et la fin de la chaine dans $9 et suivantes.
Si par contre, la date ne correspond pas (cas de la deuxième chaine), alors la fin de la chaine n'est pas en $9 et suivantes, car c'est 'nodate' qu'on a trouvé en $3 et la fin de la chaine est en $5 et suivants.
Du coup, je ne peux de manière définitive récupérer la fin de la chaine dans les mêmes variables, je suis obligé de travailler avec soit $9 et suivantes, soit $5 et suivantes, ce qui m'oblige à des lignes de code en plus.
Remarque : je mettrais aussi {1,2} à la place de {2}, au cas où le 0 ait été omis.
C'est moi qui l'ai généré, je me porte garant de la présence du 0 ;-) -
Ok, cela correspond donc à tes captures de parenthèses (c'est ce dont je me doutais), mais je ne comprends pas pourquoi tu as autant de parenthèses alors que tu veux juste deux captures...
Si tu te limites à une parenthèse par capture comme je l'ai fait, tu devrais avoir $1 sur ta (no)date, et $2 sur le reste, ce qui devrait donner ce que tu veux (ou plus exactement : ce que j'ai cru comprendre que tu voulais...) -
-
-
Salut blux :-)
Si tu fais cela :
/(\w{4})\s((\d{2}|NO)\.*(\d{2}|DA)\.*(\d{2}|TE))\s(.*)/dans le cas tu as :
Cas1 Cas2 --------------------------- $1 TITI TOTO $2 NODATE 02.01.13 $3 NO 02 $4 DA 01 $5 TE 13 $6 BOULOT-2 MAISON-1
Note : j'ai rectifié (\w{4}) pour que cela marche sur l'exemple et j'ai simplifié la fin, car je ne comprenais pas ce que tu en faisais, et j'ai retiré les captures des points, car ils ne me paraissent pas utiles.
Dal-
-
-
pour contrôler si la première lettre d'une ligne (contenant en principe une phrase) saisie par l'utilisateur commence par les lettres A à Z majuscules, il suffit de tester ceci :
^[A-Z]
Si tu veux vérifier autre chose, il faudrait expliquer plus précisément comment se présente ta source de données, ce que l'utilisateur saisit et ce que tu appelles une "phrase" et potentiellement tenir compte d'un contexte pouvant rendre la regexp très compliquée.
Par souci de clarté, je te suggère d'ouvrir un nouveau fil, ta question étant différente de celle traitée ici.
Dal -
Voci le probléme au juste le prénom est en minuscule sans accents avec la première lettre en majuscule
Pour un prénom composé, tous les prénoms sont conservés, avec chaque première lettre en majuscule
j'ai travaillé comme ca (^[A-Z]([a-z, ,-])*) mais ca concerne au juste un seul mot pas une régle générique pour tous les mots...
Merci de me répondre si tu as une idée et merci bien pour votre collaboration
-