[RESOLU] split d'un String/expression reguliere

[RESOLU] split d'un String/expression reguliere - Java - Programmation

Marsh Posté le 27-05-2008 à 18:02:01    

Bonjour a tous :),
 
Voila je vous expose mon probleme : je cherche a decouper un String (en Java) d'une certaine maniere seulement je n'ai pas reussi a trouver une l'expression reguliere correspondante. Un petit exemple sera plus parlant :
Je veux decouper ce String :
Voici la "chaine que je veux " decouper et j'y [arrive pas]
En fait, j'aimerais, a l'aide de la methode String.split(expression) pouvoir decouper cette chaine comme ceci :
Voici la
"chaine que je veux"
decouper et j'y
[arrive pas]
En gros, je veux decouper la chaine a partir des espaces quie ne sont pas contenus dans les guillemets, ni dans les crochets. J'ai pas mal lutte et j'ai toujours pas reussi a trouver d'expressions qui marchent (a dire vrai je ne sais pas si il y en a). J'ai aussi penser a faire plusieurs split() successifs (genre 1 pour les guillemets, puis un pour les crochets et un pour les espaces) mais bon je me suis dit ca fait un peu trop a l'arrache :p
Donc voila j'espere que quelqu'un saura trouver la reponse (positive ou negative), ou bien me proposer une autre solution, parce que sinon ca sent les split() successifs :p
 
Merci bien :)


Message édité par wangyilong le 28-05-2008 à 15:25:51
Reply

Marsh Posté le 27-05-2008 à 18:02:01   

Reply

Marsh Posté le 27-05-2008 à 19:45:11    

du code on bit rien

Reply

Marsh Posté le 27-05-2008 à 23:04:05    

Bon en gros voila ma méthode  
 
public void parseString(String maChaine) {
       Pattern p = Pattern.Compile(expression_reguliere);
       String [] resultat = p.split(maChaine);
       //traitement avec mon tableau de String resultat
}
 
ma Chaine est de ce type :  
Voici la "chaine que je veux " decouper et j'y [arrive pas]  
 
Comme je l'ai dit précédemment, je veux la parser de manière a avoir pour un tableau de String comme resultat  
resultat[0] = Voici la
resultat[1] = "chaine que je veux"
resultat[2] = decouper et j'y
resultat[3] = [arrive pas]  
 
J'ai beau eu cherché, je n'ai pas reussi à trouver d'expression regulière pouvant me la parser ainsi, donc j'aimerais savoir si quelqu'un a une petit idée de l'expression (impossible?), ou bien encore une autre solution, excepté faire des split() successifs
 
Merci


Message édité par wangyilong le 27-05-2008 à 23:04:38
Reply

Marsh Posté le 28-05-2008 à 00:10:05    

super toujours pas d'exemple.
 
/^(.+?)(".+?" )(.+?)(\[.+?\])$/

Reply

Marsh Posté le 28-05-2008 à 12:21:40    

Bon voila que code que j'ai teste avec ton expression reguliere  
 
public class Def {
 private final String c = "/^(.+?)(\".+?\" )(.+?)(\\[.+?\\])$/";
 
 public static void main(String[] args) {
  Def d = new Def("Voici la \"chaine que je veux \" decouper et j'y [arrive pas]  " );
 }
 
 public Def(String aString){
  String []tmp = aString.split(c);
                //affichage de la taille du tableau
  System.out.println(tmp.length);
                //affichage de chaque case du tableau
  for(int i=0;i<tmp.length;i++)
   System.out.println("\n" + tmp);
 }

 
et voici l'affichage que j'ai recu  
 
[i]1
 
Voici la "chaine que je veux " decouper et j'y [arrive pas]  

 
Je sais pas si c'est de cette maniere qu'il fallait l'utiliser mais comme tu peux le voir cela ne fonctionne pas, et a vrai dire je n'ai pas bien saisi ton expression (faut dire que c'est pas mon fort tout comme le java ). Si tu pouvais m'eclairer ...
 
Merci

Reply

Marsh Posté le 28-05-2008 à 12:26:39    

c'est bien. Maintenant apprend les expressions régulières.

Reply

Marsh Posté le 28-05-2008 à 13:09:11    

Tu peut essayer ca  
 

Code :
  1. (([^"\[\]\s]*))|(\[([^]]*)\])|(\"([^"]*)\" )


 
En gros :  
Tous les caracteres sauf guillemets espaces crochets
OU
Crochet (tout sauf crochet) crochet
OU
Guillemet (tous sauf guillemets) guillemet
 
 
Si c'est pour dire de la merde Taz repond pas.

Reply

Marsh Posté le 28-05-2008 à 15:18:58    

Solution trouve, voici la bonne expression reguliere :  
 
\\s*((([^\"\\[\\]\\s]+))|(\\[([^\\]]+)\\])|(\\\"([^\"]+)\\\" ))\\s*

Reply

Marsh Posté le 28-05-2008 à 15:22:57    

Ou plutot voici le bon code :  
 

Code :
  1. public class Def {
  2.         private final String s = "\\s*((([^\"\\[\\]\\s]+))|(\\[([^\\]]+)\\])|(\\\"([^\"]+)\\\" ))\\s*";
  3.         public static void main(String[] args) {
  4.                 Def d = new Def("Voici la \"chaine que je veux \" decouper et j'y [arrive pas]  " );
  5.         }
  6.         public Def(String aString){
  7.                 Pattern p = Pattern.compile(s);
  8.                 Matcher m = p.matcher(aString);
  9.                 Vector<String> tmp = new Vector<String>();
  10.                 while(m.find()){
  11.                         tmp.add(m.group(1));
  12.                 }
  13.                 //petit affichage pour verifier les valeurs du Vector
  14.                 for(int i=0;i<tmp.size();i++)
  15.                         System.out.println(tmp.elementAt(i));
  16.         }
  17. }


 
Bon c'est pas grace a toi taz mais bon bel effort


Message édité par wangyilong le 28-05-2008 à 15:28:30
Reply

Marsh Posté le 29-05-2008 à 13:10:06    

bah je t'ai filé une regex tout aussi valide. Et plus simple.

Reply

Sujets relatifs:

Leave a Replay

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