Les expressions régulières en Java, même regex plusieurs fois de suite
-
25-09-2019 - |
Question
Je veux analyser une chaîne de 12 (souvent) flotteurs différents dans une rangée (avec un texte non pertinent devant, marquant un champ), et que vous voulez tous pour finir dans un groupe de capture de leur propre, de manière à les recueillir de l'matcher un à la fois. Je l'ai remarqué que je suis réussissais en écrivant ce qui suit:
Pattern lastYearIncomePattern = Pattern.compile("(.+\\{\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)([0-9]{1,2}\\.[0-9]{3}\\s)");
qui est une masse épuisante de code dupliqué. Le ([0-9]{1,2}\\.[0-9]{3}\\s)
partiel se produira 12 fois.
Est-il possible de le faire mieux? Je l'ai regardé sur la définition de cette chaîne pour lui-même, puis l'ajouter dans la regex via une boucle et un StringBuilder, mais tout cela semble si exagéré. Il est évident que les références arrières ne fonctionne pas non plus, puisque les 12 valeurs sont différentes.
Ma première approche a consisté à écrire ([0-9]{1,2}\\.[0-9]{3}\\s){12}
, mais cela mettra les 12 chars dans une longue chaîne, et ce n'est pas ce que je veux, comme je l'aurais besoin d'un autre modèle pour enlever les flotteurs un par un puis, puis la solution en double-frénésie est préférée.
Merci
La solution
Que diriez-vous ceci:
Pattern lastYearIncomePattern = java.util.regex.Pattern.compile("(.+\\{\\s)(([0-9]{1,2}\\.[0-9]{3}\\s){12})");
Matcher matcher = lastYearIncomePattern.matcher(input);
boolean found =matcher.find();
if(found){
String[] values= matcher.group(2).split("\\s");
}
Il fonctionne. Ce serait intéressant de voir si cela peut être fait dans un op comme vous espériez.
Autres conseils
Vous pouvez écrire l'expression rationnelle d'un seul flotteur, puis utilisez Matcher.find (int) pour itérer les occurrences.