Salut,
pour moi les expressions régulières sont fait pour traiter des motifs répétitifs, mais pas une occurence particulière de la répétition.
Genre je cherche les sous parties de ma chaîne qui correspondent à cette définition particulière. Et si je veux le nième, j'itère autant de fois que nécessaire...
On peut bien sur bricoler des trucs du genre :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Pattern p = Pattern.compile("([0-9]{4})(?:,[0-9\\.]+)|(,[0-9.]+)"); String entree = "12/12/2005,43.45,32.1,"; Matcher m = p.matcher(entree); int i = 1; while (m.find()) System.out.print(m.group(i++)); System.out.println();
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Pattern p = Pattern.compile("[0-9]{4}|,3[0-9.]+"); String entree = "12/12/2005,43.45,32.1,"; Matcher m = p.matcher(entree); while (m.find()) System.out.print(m.group()); System.out.println();
ou encore
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Pattern p = Pattern.compile("([0-9]{4}),.*?(,[0-9.]+)"); String entree = "12/12/2005,43.45,32.1,"; Matcher m = p.matcher(entree); while (m.find()) System.out.print(m.group(1) + m.group(2)); System.out.println();
mais c'est un peu tordu je trouve et bien se compliquer la vie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 String entree = "12/12/2005,43.45,32.1,"; Pattern p = Pattern.compile("[0-9]{4}"); Matcher m = p.matcher(entree); while (m.find()) System.out.print(m.group()); p = Pattern.compile(",[0-9.]+"); m = p.matcher(entree); for (int i = 0; i < 2; i++) m.find(); System.out.print(m.group()); System.out.println();
En plus chercher une regexp exprimée telle que j'ai une entrée X et je veux obtenir une entrée Y n'est pas le moyen le plus simple pour savoir exactement ce qu'on veut faire. Une expression du genre je cherche une suite de 4 chiffres ou des nombres décimaux avec . comme virgule, séparés par des virgules me semble plus correspondre avec la notion de regexp.
Pourquoi pas simplement faire un split sur virgule, puis un parse avec un SimpleDateFormat sur le premier item et récupérer directement le troisième item ?
Partager