[Java] expression régulière : extraction à partir d'un motif

expression régulière : extraction à partir d'un motif [Java] - Java - Programmation

Marsh Posté le 24-05-2006 à 23:18:14    

'lut
 
Bon, commençons par le commencement: j'ai cherché sur le forum (et ailleurs), j'ai testé 26 milliards de trucs moi-même, mais pour le moment je galère comme un sagoin, et je ne vois pas de solution simple à mon pb - même si j'en discerne une pour le moment que je suis en train d'implémenter.
 
Le pb: J'ai un motif constitué de 'caracteres spéciaux' à mon application (%X où X est un chiffre), représentant chacun un type de données spécifiques, et un ensemble de chaînes desquelles je dois extraire les différentes données spécifiques en se basant sur le motif.
 
Ex.:
motif : "%2\\%0_%1"
une chaîne xx : "blublu\\truc_bidule"
une chaîne yy : "blabla\\trac_bidale"
 
résultat attendu:
pour la chaîne xx: %2 = 'blublu' - %0 = 'truc' - %1 = 'bidule'
pour la chaîne yy: %2 = 'blabla' - %0 = 'trac' - %1 = 'bidale'
 
---
Bon, ce à quoi je suis arrivé pour le moment:
 
A l'aide d'un StringTokenizer, j'ai extrait les '2', '0' et '1' du motif, et les ai rangé dans un ArrayList
 
Avec le Pattern "[\\p{Alnum}\\s\\p{Punct}&&[^\\\\_]]+", j'arrive à extraire blublu, truc et bidule et à les ranger dans un ArrayList
 
Vous me direz que tout marche bien, oui sauf que la partie [^\\\\_] est trop restrictive par rapport à 1 seul type de motif
 
Ex.:
même motif
une chaîne zz : "blu_blu\\truc_bidule"
 
Là, j'ai 4 trucs extraits: 'blu', 'blu', 'truc' et 'bidule'
 
J'ai aussi essayé en construisant le [^...] sur la base des caractères du motif autres que %X, donc c'est moins restrictif mais le pb est identique
 
Ex.:
motif : "- %2\\%0_%1"
une chaîne tt : "- blu-blu\\tr uc_bid-ule"
Le Pattern devient "[\\p{Alnum}\\s\\p{Punct}&&[^\\\\-_]]+"
Là, j'ai 5 trucs extraits: '-', 'blu-blu', 'tr', 'uc', 'bid-ule', donc c'est pas ça :(
 
...
 
Bon, je ne demande pas de me faire l'algo, je voudrais juste déjà savoir si ce que je veux faire est facilement faisable ou pas (je veux dire par là en qqes lignes de Matcher.find() / Matcher.group(), String.split() ou autres) ou si c'est plus complexe que ça.
 
Mon idée actuelle est d'extraire du motif autant de sous-motifs que de %, puis de faire coïncider chaque sous-motif sur les chaînes à tester à coup de regex.
 
Ex.: du motif "- %2\\%0_%1", extraire "- %2\\", "\\%0_" et "_%1"
Puis, donc avec un Matcher.find() / Matcher.group() récupérer ce qu'il me faut (éventuellement retraiter derrière, comme j'ai pas encore implémenté, y'a peutetre besoin)
 
 
Voilà, qu'en pensez-vous ? Merci d'avance :)


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 24-05-2006 à 23:18:14   

Reply

Marsh Posté le 25-05-2006 à 21:08:57    

Bonjour!
Je crois que tu devrais te concentrer encore un peu sur ton pattern, car il ne correspond pas à ce que tu souhaites faire. Celui que tu présente dans ton post signigie, littérallement :
"trouver tous les ensembles constitués d'un ou plusieurs des caractères suivants : caractères alphanumérique, espace, etc... "
Et ceci quel que soit l'ordre de ces caractères.
 
Or ce que tu veux c'est isoler 3 ensembles distincts. Tu as donc tout intérêt à utiliser des groupes de captures. De tête, tu devrais aboutir à quelque chose de ce genre :
([\\p{Alnum)}\\s])+\\\\([\\p{Alnum)}\\s])+_([\\p{Alnum)}\\s])+
 
Je te laisse le soin de vérifier et de corriger !...

Reply

Marsh Posté le 26-05-2006 à 00:49:00    

J'avais en effet bien vu ce principe de groupes, sans bien comprendre (la javadoc c'est pas tjs immédiat), testé (très peu) maladroitement et non_sans_exception-nellement, mais abandonné car je ne savais pas où j'allais, donc sans garantie de retour sur investissement (temporel je parle).
Sur tes conseils - merci! -, je vais donc m'y pencher beaucoup plus sérieusement :) Je te/vous tiens au courant !

Reply

Marsh Posté le 26-05-2006 à 02:04:50    

Ok, c'est bon ça avance bien.
Avec en effet un pattern comprenant des groupes qui remplacent chaque %X de mon motif, puis un retraitement derrière c'est bueno.
 
Ex.: motif : "- %2\\%1_%0"
Je construis automatiquement un 2nd motif qui remplace les %X par (.+), ce qui me donne donc le Pattern "- (.+)\\\\(.+)_(.+)"
 

Code :
  1. String motifSeparateur = "- %2\\%1_%0";
  2. String motifSeparateur2;
  3. ArrayList listeData;
  4. String strTest = "- bla-bla\\tr uc_bidule";
  5. listeData = new ArrayList(0);
  6. motifSeparateur2 = motifSeparateur.replaceAll("%[0-3]", "(.+)" );
  7. Matcher m = Pattern.compile(motifSeparateur2).matcher(strTest);
  8. m.lookingAt();
  9. for (int i=1 ; i<=m.groupCount() ; i++) listeData.add(m.group(i));
  10. listeData.trimToSize();


 
Me reste maintenant à voir comment quoter dans mon motifSeparateur2, tout les caractères spécifiques aux regex ('\' par exemple, pour lequel il faut un '\\\\' dans motifSeparateur2 pour ne pas générer d'erreur (le code ci-dessus ne marche donc pas, nda)). QQun aurait-il une piste ? J'ai vu la classe MessageFormat (rapidos), cela peut-il me faciliter la chose ?


Message édité par trevor le 26-05-2006 à 02:19:06

---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed