(Відповідь 4castle краще, ніж наведено нижче, якщо ви можете припустити, що Java> = 9)
Вам потрібно створити відповідник і використовувати його для ітеративного пошуку збігів.
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());
}
Після цього allMatchesміститься відповідність, і ви можете використовувати allMatches.toArray(new String[0])для отримання масиву, якщо він вам справді потрібен.
Ви також MatchResultможете писати допоміжні функції, щоб перебирати сірники, оскільки Matcher.toMatchResult()повертає знімок поточного стану групи.
Наприклад, ви можете написати лінивий ітератор, щоб вам це зробити
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
роблячи щось подібне:
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(); }
};
}
};
}
З цим,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
врожайність
a at 0
b at 1
a at 3
c at 4
a at 5
a at 7
b at 8
a at 10