( A resposta do 4castle é melhor que a abaixo, se você puder assumir Java> = 9)
Você precisa criar um correspondente e usá-lo para encontrar correspondências iterativamente.
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());
}
Depois disso, allMatches
contém as correspondências e você pode usar allMatches.toArray(new String[0])
para obter uma matriz se realmente precisar de uma.
Você também pode usar MatchResult
para escrever funções auxiliares para fazer loop sobre correspondências, pois Matcher.toMatchResult()
retorna uma captura instantânea do estado atual do grupo.
Por exemplo, você pode escrever um iterador lento para permitir que você faça
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
fazendo algo parecido com isto:
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(); }
};
}
};
}
Com isso,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
rendimentos
a at 0
b at 1
a at 3
c at 4
a at 5
a at 7
b at 8
a at 10