( Réponse de 4castle est meilleure que celle ci-dessous si vous pouvez supposer que Java >= 9)
Vous devez créer un matcher et l'utiliser pour trouver des correspondances de manière itérative.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
...
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile("your regular expression here")
.matcher(yourStringHere);
while (m.find()) {
allMatches.add(m.group());
}
Après ça, allMatches
contient les correspondances, et vous pouvez utiliser allMatches.toArray(new String[0])
pour obtenir un tableau si vous en avez vraiment besoin.
Vous pouvez également utiliser MatchResult
pour écrire des fonctions d'aide pour boucler sur les correspondances depuis Matcher.toMatchResult()
renvoie un instantané de l'état actuel du groupe.
Par exemple, vous pouvez écrire un itérateur paresseux qui vous permet de faire
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
en faisant quelque chose comme ça :
public static Iterable<MatchResult> allMatches(
final Pattern p, final CharSequence input) {
return new Iterable<MatchResult>() {
public Iterator<MatchResult> iterator() {
return new Iterator<MatchResult>() {
// Use a matcher internally.
final Matcher matcher = p.matcher(input);
// Keep a match around that supports any interleaving of hasNext/next calls.
MatchResult pending;
public boolean hasNext() {
// Lazily fill pending, and avoid calling find() multiple times if the
// clients call hasNext() repeatedly before sampling via next().
if (pending == null && matcher.find()) {
pending = matcher.toMatchResult();
}
return pending != null;
}
public MatchResult next() {
// Fill pending if necessary (as when clients call next() without
// checking hasNext()), throw if not possible.
if (!hasNext()) { throw new NoSuchElementException(); }
// Consume pending so next call to hasNext() does a find().
MatchResult next = pending;
pending = null;
return next;
}
/** Required to satisfy the interface, but unsupported. */
public void remove() { throw new UnsupportedOperationException(); }
};
}
};
}
Avec ça,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
donne
a at 0
b at 1
a at 3
c at 4
a at 5
a at 7
b at 8
a at 10
3 votes
Bonne question. L'information que vous cherchez devrait faire partie des documents Java sur Regex et Matcher. Malheureusement, ce n'est pas le cas.
4 votes
C'est vraiment dommage. Cette fonctionnalité semble exister d'emblée dans presque tous les autres langages (qui prennent en charge les expressions régulières).