Vấn đề
Java không có phương thức built-in trả về list tất cả match. Cần dùng List + vòng lặp while(matcher.find()) thêm vào list.
Ví dụ: Thu thập tất cả số trong chuỗi
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ListOfMatches {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Nhập văn bản: ");
String input = sc.nextLine();
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);
ArrayList<String> list = new ArrayList<>();
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
list.add(matcher.group());
}
Iterator<String> it = list.iterator();
System.out.println("Danh sách khớp: ");
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
Kết quả
Nhập văn bản: sample 1432 text 53 with 363 numbers
Danh sách khớp:
1432
53
363
Cách hiện đại (Java 9+)
// Dùng Matcher.results() trả về Stream<MatchResult>
List<String> matches = pattern.matcher(input)
.results()
.map(MatchResult::group)
.collect(Collectors.toList());
Java 8 - dùng Iterator pattern
// Tạo Iterable từ Matcher
Iterable<String> matches = () -> new Iterator<String>() {
Matcher m = pattern.matcher(input);
public boolean hasNext() { return m.find(); }
public String next() { return m.group(); }
};