Expression régulière

Fermé
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 17 avril 2024 - 4 févr. 2013 à 16:17
khalilamk Messages postés 2 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 22 mai 2013 - 22 mai 2013 à 14:42
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.

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 févr. 2013 à 17:01
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.
0
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 17 avril 2024 3 286
4 févr. 2013 à 17:13
"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 ;-)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 févr. 2013 à 17:22
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...)
0
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 17 avril 2024 3 286
Modifié par blux le 4/02/2013 à 17:40
Je mets plein de parenthèses, parce que c'est plus lisible pour les autres ;-)
Et puis aussi, je veux pouvoir manipuler la date pour la remettre en french, la fin de ma chaine car je fais des traitements en fonction de ce que j'y trouve...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 4/02/2013 à 17:26
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
0
blux Messages postés 25976 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 17 avril 2024 3 286
4 févr. 2013 à 17:40
Sauf que j'ai un peu triché, c'est pas NODATE que je recherche, mais ' expired'.
Je crois que je vais creuser un peu plus ta soluce...

Merci bien à vous deux...
0
khalilamk Messages postés 2 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 22 mai 2013
22 mai 2013 à 13:06
J'ai une question comment controler un utilisateur saisit dans une phrase tjrs la premiére lettre en majuscule moi j'ai fais ce controle sur un mot mais j'ai pas su comment l'appliquer sur tous les mots?

(^[A-Z]([a-z, ,-])*)
Merci de me répondre si vous avez une idée
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
22 mai 2013 à 13:27
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
0
khalilamk Messages postés 2 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 22 mai 2013
22 mai 2013 à 14:42
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
0