Biểu thức chính quy (regular expression) là một chuỗi ký tự đặc biệt giúp bạn khớp hoặc tìm kiếm các chuỗi khác, sử dụng cú pháp chuyên biệt được giữ trong một mẫu (pattern).
Nhóm bắt trong biểu thức chính quy
Các nhóm bắt (capturing groups) trong biểu thức chính quy được dùng để xử lý nhiều ký tự như một đơn vị duy nhất, được biểu diễn bằng cặp ngoặc đơn (). Nếu bạn đặt nhiều mẫu con bên trong một cặp ngoặc, chúng sẽ được xem như một nhóm.
Ví dụ: mẫu [0-9] khớp với các chữ số từ 0 đến 9, và mẫu {5} khớp với 5 ký tự bất kỳ. Nếu nhóm hai mẫu này thành ([0-9]{5}), nó sẽ khớp với một số có 5 chữ số.
Ví dụ 1: Xác thực ngày tháng
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CapturingGroupsExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Nhập tên của bạn: ");
String name = sc.nextLine();
System.out.println("Nhập ngày sinh (MM/DD/YYYY): ");
String dob = sc.nextLine();
// Biểu thức chính quy chấp nhận định dạng MM/DD/YYYY
String regex = "^(1[0-2]|0[1-9])/" // Cho tháng
+ "(3[01]|[12][0-9]|0[1-9])/" // Cho ngày
+ "[0-9]{4}$"; // Cho năm
// Tạo đối tượng Pattern với chế độ COMMENTS để bỏ qua khoảng trắng và chú thích
Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
Matcher matcher = pattern.matcher(dob);
boolean result = matcher.matches();
if (result) {
System.out.println("Ngày sinh hợp lệ");
} else {
System.out.println("Ngày sinh không hợp lệ");
}
}
}
Kết quả
Nhập tên của bạn: Krishna Nhập ngày sinh: 09/26/1989 Ngày sinh hợp lệ
Ví dụ 2: Trích xuất các nhóm
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GroupTest {
public static void main(String[] args) {
String regex = "(.*)(\\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers in between.";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("Khớp toàn bộ: " + matcher.group(0));
System.out.println("Nhóm 1: " + matcher.group(1));
System.out.println("Nhóm 2: " + matcher.group(2));
System.out.println("Nhóm 3: " + matcher.group(3));
}
}
}
Kết quả
Khớp toàn bộ: This is a sample Text, 1234, with numbers in between. Nhóm 1: This is a sample Text, 123 Nhóm 2: 4 Nhóm 3: , with numbers in between.
Giải thích: Mẫu (.*)(\\d+)(.*) chia chuỗi thành 3 nhóm: nhóm 1 khớp tham lam với mọi thứ cho đến chữ số cuối cùng, nhóm 2 bắt lấy chữ số cuối cùng (do \\d+ khớp một hoặc nhiều chữ số), nhóm 3 lấy phần còn lại.