Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
976 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1374689
trevor
laissez la vie vous étonner...
Posté le 24-05-2006 à 23:18:14  profilanswer
 

'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
mood
Publicité
Posté le 24-05-2006 à 23:18:14  profilanswer
 

n°1375114
post_it
Hmmmm!...
Posté le 25-05-2006 à 21:08:57  profilanswer
 

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 !...

n°1375285
trevor
laissez la vie vous étonner...
Posté le 26-05-2006 à 00:49:00  profilanswer
 

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 !

n°1375307
trevor
laissez la vie vous étonner...
Posté le 26-05-2006 à 02:04:50  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
génération de fichier XML à partir d'une base de données SQL ??pas la bonne page qui s'affiche, JAVA en cause ?
[java] liaison bluetoothdébutant en java script
java vers UML ?BATCH DOS :Comment passer les paramètres à partir d'un fichier ?
question Javalancer un log a partir d'excel (macro)
nouvelle fenetre de commande à partir d'une fenetre de commande[JAVA Débutant] KeyListerner sur JFrame OK, mais sur un JPanel ?
Plus de sujets relatifs à : [Java] expression régulière : extraction à partir d'un motif


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR