( La respuesta de 4castle es mejor que la siguiente si puede suponer Java> = 9)
Debe crear un emparejador y usarlo para encontrar coincidencias de forma iterativa.
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());
}
Después de esto, allMatches
contiene las coincidencias y puede usar allMatches.toArray(new String[0])
para obtener una matriz si realmente necesita una.
También puede usar MatchResult
para escribir funciones auxiliares para recorrer las coincidencias ya que Matcher.toMatchResult()
devuelve una instantánea del estado actual del grupo.
Por ejemplo, puedes escribir un iterador perezoso que te permita hacer
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
haciendo algo como esto:
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(); }
};
}
};
}
Con este,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
rendimientos
a at 0
b at 1
a at 3
c at 4
a at 5
a at 7
b at 8
a at 10