je cherche a découper un string selon plusieurs critères :
exp:
je veux obtenir unCode:String str= "1/2/2016 16:34";
j'arrive pas a appeler split() plusieurs fois !Code:String[] tab={"1","2","2016","16","34"};
Version imprimable
je cherche a découper un string selon plusieurs critères :
exp:
je veux obtenir unCode:String str= "1/2/2016 16:34";
j'arrive pas a appeler split() plusieurs fois !Code:String[] tab={"1","2","2016","16","34"};
Tu devrais t'en sortir avec des boucles.
Tu commence par faire un split("/") sur ton string. Puis sur chaque élément du tableau obtenu split(":"). Puis sur chaque élément du nouveau tableau split(" ").
merci pour la réponse, sauf que les les paramètres changent a chaque fois ;
la méthode Découpe une chaîne de caractères en utilisant successivement des séparateurs.
Code:
1
2
3
4
5
6
7
8
9
10
11
12 public static String[] decouper(String source, String separateurs) { *************************************** } public static void main(String[] args) { String param ="abc-de fg;gt"; String sep ="- ;"; String[]tab=Decoupeur.decouper(param,sep); Decoupeur.afficheTableauStr(tab); //resultat = {abc,de,fg,gt} }
Salut,
Tu peux toujours remplacer tous tes séparateurs par un seul et unique avant de faire ton split() dessus. Ça évite de faire pleins de boucles.
Ex:
Affiche [abc, de, fg, gt]Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public static void main( String[] args ) { String param = "abc-de fg;gt"; String sep = "- ;"; String[] tab = decoupe( param, sep ); System.out.println( Arrays.deepToString( tab ) ); } public static String[] decoupe( String value, String sep ) { return value.replaceAll( "[" + sep + "]", ";" ).split( ";" ); // Ici les crochets indique un ensemble de valeur dans une expression régulière }
Cdt.
merci,
j'ai trouvé ça: et je pense que ça marche aussi:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public static String[] decouper(String source, String separateurs) { if(source==null||separateurs==null){ throw new NullPointerException(); } String[] temp=null; String[] res=new String[100]; String[] tabSeparateurs=separateurs.split(""); //afficheTableauStr(tabSeparateurs); int s=0; int compt=1; temp=source.split(tabSeparateurs[0]); res[0]=temp[0]; for(int i=1;i<tabSeparateurs.length;i++){ for(int j=1;j<temp.length;j++){ temp=temp[j].split(tabSeparateurs[i]); res[compt]=temp[j-1]; s=j; } compt++; } res[compt+1]=temp[s]; return res; }
Ca ne marche, à peine, que si les séparateurs arrivent dans le même ordre, dans les deux paramètres.
Et même dans ce cas, le tableau renvoyé est de taille 100, ce qui ne sera presque jamais la bonne taille.
Il vaut mieux utiliser un split() qui les gère tous à la fois.
Par contre,
Il n'est pas utile de faire replaceAll() avant un split(), puisque split() lui-même est à base de regex, donc c'est équivalent en un peu moins performant que :
Toutefois, c'est peut-être un peu naïf de faire des trucs comme "[" + sep + "]", qu'est-ce qui se passe si comme séparateur on a des \ ou - ou [ ]Code:value.split("[" + sep + "]");
Pour régler ça, on en arrive à des trucs comme :
ce qui devient de toute façon un peu compliqué (et je suis même pas tout à fait sûr que ça suffise).Code:
1
2 String separatorRegex = "[" + Pattern.quote(sep).replace("-", "\\-") + "]"; return value.split(separatorRegex);
C'est vrai.. je sais pas trop pourquoi j'en suis arrivé là (c'est vendredi :))Citation:
Il n'est pas utile de faire replaceAll() avant un split(), puisque split() lui-même est à base de regex
C'est marrant en l'écrivant j'étais sûr que ça allait arriver sur le tapis :mouarf:Citation:
Toutefois, c'est peut-être un peu naïf de faire des trucs comme "[" + sep + "]", qu'est-ce qui se passe si comme séparateur on a des \ ou - ou [ ]
Pour régler ça, on en arrive à des trucs comme :
Disons effectivement que ça marche dans la plus part des cas. Mais comme l’échappement des caractères spéciaux est toujours un problème dans ce genre de sujet, j'ai préféré ne pas pas en parler et ne pas amener trop de complexité..
Ceci dit tu as tout à fait raison.
bonjour,
et pourquoi ne pas utiliser un bon vieux StringTokenizer :
Code:
1
2
3
4
5
6
7
8
9 public static String[] decouper(String source, String separateurs) { StringTokenizer st = new StringTokenizer(source, separateurs); List<String> lst = new ArrayList<>(); while (st.hasMoreElements()) { lst.add((String) st.nextElement()); } return lst.toArray(new String[lst.size()]); }
Code:
1
2
3
4 String splitString = "1/2/2016 16:34"; String[] array = decouper(splitString, "/ :"); System.out.println("array => " + Arrays.toString(array));
je peux vous demander comment vous arrivez tous à des codes aussi tarabiscotés par rapport à la demande de départ? Vu que les séparateurs n'ont rien de dynamique je vois pas pourquoi jouer avec Pattern.quote. Quand au Tokenizer, c'est juste créer une méthode découper pour ne pas avoir à écrire deux caractères de plus dans l'appel à split...
Aussi, pour parser une date, vu que ce sont des dates, il vaux mieux passer par SimpleDateFormat qui te permettra d'obtenir un objet java.util.Date et de valider cette Date. Histoire de ne pas parserCode:
1
2 String texte="1/2/2016 16:34"; String[] tableau =texte.split("[ /:]");
58/13/4578 25:78
En fait on peut écrire tout simplement:\Q...\E est interprété même au sein d'une classe de caractère, donc il est inutile d'échapper autre chose comme un hyphen ou un crochet fermant à l'aide d'un replace. Et quand bien même on essayerait de tendre un piège à cette méthode en lui passant "abcd\\Eefgh" (soit abcd\Eefgh), elle produira: "\\Qabcd\\E\\\\E\\Qefgh\\E" (soit \Qabcd\E\\E\Qefgh\E).Code:
1
2 String separatorRegex = "[" + Pattern.quote(sep) + "]"; return value.split(separatorRegex);
Oui, et plus important ça marchait pas mon idée, en fait. C'était plus pour dire que du coup les choses devenaient compliquées en essayant de faire comme ça.
Pour rappel, la documentation de Pattern.quote() ne dit pas du tout qu'elle se base sur \Q...\E. En pratique c'est le cas avec les implémentations qu'on connaît, parce que ça va de soi, mais une autre implémentation a parfaitement le droit de faire autrement. La doc dit que la String résultante peut être utilisée comme regex, et absolument pas comme classe de caractère. Du coup, fondamentalement, c'est plutôt la méfiance que ça devrait inspirer.