( Câu trả lời của 4 Castle tốt hơn câu trả lời dưới đây nếu bạn có thể giả sử Java> = 9)
Bạn cần tạo một công cụ đối sánh và sử dụng công cụ đó để lặp lại tìm kết quả khớp.
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());
}
Sau này, allMatches
chứa các kết quả khớp và bạn có thể sử dụng allMatches.toArray(new String[0])
để lấy một mảng nếu bạn thực sự cần.
Bạn cũng có thể sử dụng MatchResult
để viết các hàm trợ giúp để lặp lại các kết quả trùng khớp vì Matcher.toMatchResult()
trả về một ảnh chụp nhanh về trạng thái nhóm hiện tại.
Ví dụ, bạn có thể viết một trình vòng lặp lười biếng để cho phép bạn làm
for (MatchResult match : allMatches(pattern, input)) {
// Use match, and maybe break without doing the work to find all possible matches.
}
bằng cách làm một cái gì đó như thế này:
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(); }
};
}
};
}
Với cái này,
for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) {
System.out.println(match.group() + " at " + match.start());
}
sản lượng
a at 0
b at 1
a at 3
c at 4
a at 5
a at 7
b at 8
a at 10