avec Pattern Matcher et éventuellement Scanner
Utiliser les Pattern permet aussi de parcourir plusieurs lignes et les gros fichiers.
Je pense aux .log qui peuvent atteindre plusieurs millions de lignes en production.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public static void main(final String[] args) {
final boolean avecVirguleFinale = //
false
// true
//
;
final String s = "ou=ab ,ou=cd,ou=efgh, ou=ijkl, ou=mnop ";
Pattern p; // Le Pattern doit être compilé avant la boucle
Matcher m;
if (!avecVirguleFinale) {
// On est obligé de tester la fin de ligne séparémment
p = Pattern.compile("(=).[A-Z ]*(,)|(=).[a-zA-Z]*($)",
Pattern.CASE_INSENSITIVE);
// les () délimitent les groupes
m = p.matcher(s.trim());
} else {
p = Pattern.compile("(=).[A-Z ]*(,)", Pattern.CASE_INSENSITIVE);
// les () délimitent les groupes
m = p.matcher(s.trim() + ",");
}
final int i = m.regionStart();
System.out.println("i==" + i + ", " + m);
while (m.find()) {
System.out.println(m.group().replaceAll("=|,", ""));
}
System.out
.println("--- Avec Scanner + 'avecVirguleFinale = false;' obligatoire ---");
final Scanner scan = new Scanner(s);
// on peut aussi remplacer s par : new File(url_ou_path_fichier);
while (scan.hasNext()) {
final String champLu = scan.next();
System.out.println("scan.hasNext() == " + champLu);
m = p.matcher(champLu.trim());
while (m.find()) {
System.out.println("\t" + m.group().replaceAll("=|,", ""));
}
}
} |
Ce qui donne à la console
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
i==0, java.util.regex.Matcher[pattern=(=).[A-Z ]*(,)|(=).[a-zA-Z]*($) region=0,40 lastmatch=]
ab
cd
efgh
ijkl
mnop
--- Avec Scanner + 'avecVirguleFinale = false;' obligatoire ---
scan.hasNext() == ou=ab,ou=cd
ab
cd
scan.hasNext() == ,ou=efgh,
efgh
scan.hasNext() == ou=ijkl,
ijkl
scan.hasNext() == ou=mnop
mnop |