Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Lấy danh sách tất cả khớp - Java Regular Expressions


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(); }
};