Trouver toutes les occurrences d'une regexp (et seulement elles) en Java
12 réponses
Olivier Miakinen
[diapublication entre fr.comp.lang.regexp et fr.comp.lang.java, suivi
vers fr.comp.lang.java seul]
Bonjour,
Pour une fois c'est moi qui vais poser une question de regexp, parce
qu'en Java je suis un peu perdu entre les méthodes matches, find et
lookingAt de la classe Matcher.
Soit une chaîne telle que celle-ci :
String s = "<ABC> <AABBA> <CBCC> <ABB> <C> ";
Je voudrais en extraire les sous-chaînes successives :
"ABC", "AABBA", "CBCC", "ABB" et "C".
Pour ce faire, je pense donc utiliser le Pattern suivant :
Pattern p = Pattern.compile("<([ABC]*)> ");
puis :
Matcher m = p.matcher(s);
Mais ce n'est pas tout : je voudrais pouvoir détecter si la chaîne
contient autre chose que ce que je compte y trouver. Par exemple,
la rechercher doit échouer si la chaîne de départ vaut :
String s = "<ABC> <AABBA> <CBCC> foo <ABB> <C> ";
mais aussi si elle vaut :
String s = "<ABC> <AABBA> <CBCC> <ABB> <C> bar";
lisp... qui porte toujours très bien son acronyme: Lots of Insipid ParenthesiS:) :) :) :)
Hum... Ton développement ne marche pas, ce n'est pas "Lips" mais Lisp.
Mais si c'est bon. C'est comma ca que j'ai gagné une course de cyclimse un jour :) :) :) ;) :P
Olivier Miakinen
Le 22/10/2017 00:11, Yliur a écrit :
Ceci étant dit, l'exemple d'Olivier ne contient pas tellement de parenthèses, il n'est juste pas indenté parce qu'on n'en a qu'un fragment,
C'est vrai qu'on n'en a qu'un fragment, mais il ne manque pas grand chose pour avoir la totalité.
parce qu'il s'agit de code généré,
Oui.
parce qu'il a trouvé que ce serait plus simple de l'écrire sur une seule ligne,
C'est vrai aussi. Au départ ça peut être sur plusieurs lignes et je commence par en faire une seule (en supprimant des « <LF> »).
parce qu'il ne voulait pas que la chaîne soit "propre" mais pleine de variations que son expression doit capturer malgré tout,
Oui, aussi. En principe la chaîne est plus régulière que ça, car générée automatiquement, mais je voudrais prévoir d'éventuelles modifications manuelles. Noter qu'elle n'est pas spécialement indentée non plus, n'étant pas destinée en principe à être écrite ni lue par un humain mais juste par des programmes.
[...] Sinon c'est indiscret de demander à Olivier ce qu'il fait avec du code Lisp ? Une traduction d'un code dans un autre langage ?
Ce n'est pas spécialement indiscret, mais pas forcément très intéressant non plus. Disons qu'il s'agit d'une partie d'un fichier de configuration qui est normalement lu par un programme parlant SML¹, un dialecte de Lisp, mais qui là doit être traité par un programme en Java. Cordialement, -- Olivier Miakinen ¹ SML : System Management Language
Le 22/10/2017 00:11, Yliur a écrit :
Ceci étant dit, l'exemple d'Olivier ne contient pas tellement de
parenthèses,
il n'est juste pas indenté parce qu'on n'en a qu'un fragment,
C'est vrai qu'on n'en a qu'un fragment, mais il ne manque pas grand
chose pour avoir la totalité.
parce qu'il s'agit de code généré,
Oui.
parce qu'il a trouvé que ce serait plus simple de l'écrire sur une
seule ligne,
C'est vrai aussi. Au départ ça peut être sur plusieurs lignes et je
commence par en faire une seule (en supprimant des « <LF> »).
parce qu'il ne voulait pas que la chaîne soit "propre" mais pleine
de variations que son expression doit capturer malgré tout,
Oui, aussi. En principe la chaîne est plus régulière que ça, car
générée automatiquement, mais je voudrais prévoir d'éventuelles
modifications manuelles. Noter qu'elle n'est pas spécialement
indentée non plus, n'étant pas destinée en principe à être écrite
ni lue par un humain mais juste par des programmes.
[...]
Sinon c'est indiscret de demander à Olivier ce qu'il fait avec du code
Lisp ? Une traduction d'un code dans un autre langage ?
Ce n'est pas spécialement indiscret, mais pas forcément très intéressant
non plus. Disons qu'il s'agit d'une partie d'un fichier de configuration
qui est normalement lu par un programme parlant SML¹, un dialecte de
Lisp, mais qui là doit être traité par un programme en Java.
Cordialement,
--
Olivier Miakinen
¹ SML : System Management Language
Ceci étant dit, l'exemple d'Olivier ne contient pas tellement de parenthèses, il n'est juste pas indenté parce qu'on n'en a qu'un fragment,
C'est vrai qu'on n'en a qu'un fragment, mais il ne manque pas grand chose pour avoir la totalité.
parce qu'il s'agit de code généré,
Oui.
parce qu'il a trouvé que ce serait plus simple de l'écrire sur une seule ligne,
C'est vrai aussi. Au départ ça peut être sur plusieurs lignes et je commence par en faire une seule (en supprimant des « <LF> »).
parce qu'il ne voulait pas que la chaîne soit "propre" mais pleine de variations que son expression doit capturer malgré tout,
Oui, aussi. En principe la chaîne est plus régulière que ça, car générée automatiquement, mais je voudrais prévoir d'éventuelles modifications manuelles. Noter qu'elle n'est pas spécialement indentée non plus, n'étant pas destinée en principe à être écrite ni lue par un humain mais juste par des programmes.
[...] Sinon c'est indiscret de demander à Olivier ce qu'il fait avec du code Lisp ? Une traduction d'un code dans un autre langage ?
Ce n'est pas spécialement indiscret, mais pas forcément très intéressant non plus. Disons qu'il s'agit d'une partie d'un fichier de configuration qui est normalement lu par un programme parlant SML¹, un dialecte de Lisp, mais qui là doit être traité par un programme en Java. Cordialement, -- Olivier Miakinen ¹ SML : System Management Language