( Die Antwort von 4castle ist besser als die folgende, wenn Sie Java> = 9 annehmen können.)
Sie müssen einen Matcher erstellen und diesen verwenden, um iterativ Übereinstimmungen zu finden.
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());
}
Danach allMatches
enthält es die Übereinstimmungen, und Sie können verwenden allMatches.toArray(new String[0])
, um ein Array zu erhalten, wenn Sie wirklich eines benötigen.
Sie können auch Hilfsfunktionen MatchResult
schreiben, um Übereinstimmungen zu durchlaufen, da Matcher.toMatchResult()
eine Momentaufnahme des aktuellen Gruppenstatus zurückgegeben wird.
Zum Beispiel können Sie einen faulen Iterator schreiben, damit Sie dies tun können
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
indem Sie so etwas tun:
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(); }
};
}
};
}
Mit diesem,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
ergibt
a at 0
b at 1
a at 3
c at 4
a at 5
a at 7
b at 8
a at 10