Bỏ qua để đến nội dung

Biểu thức chính quy (Regex)

Cách đơn giản nhất để dùng regex trong Java là gọi trực tiếp String.matches():

String email = "[email protected]";
boolean isValid = email.matches("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
System.out.println(isValid); // true

⚠️ Trong Java, dấu \ trong chuỗi phải viết thành \\ (vì \ cũng là ký tự escape của chuỗi Java) - ví dụ regex \d+ (một hay nhiều chữ số) phải viết là "\\d+".

Ký hiệu Ý nghĩa
\d một chữ số (0-9)
\w một ký tự chữ/số/gạch dưới
\s một khoảng trắng
. bất kỳ ký tự nào
+ một hoặc nhiều lần
* không hoặc nhiều lần
? không hoặc một lần
{n,m} từ n đến m lần
^ / $ đầu / cuối chuỗi
[abc] một trong các ký tự a, b, c
System.out.println("12345".matches("\\d+")); // true - toàn số
System.out.println("abc123".matches("\\d+")); // false - có chữ cái
System.out.println("2026-09-17".matches("\\d{4}-\\d{2}-\\d{2}")); // true - đúng định dạng ngày

3. PatternMatcher - khi cần dùng lại nhiều lần

Phần tiêu đề “3. Pattern và Matcher - khi cần dùng lại nhiều lần”

Khi cần kiểm tra cùng một mẫu regex nhiều lần (ví dụ trong vòng lặp), nên biên dịch Pattern một lần và tái sử dụng, thay vì gọi matches() (biên dịch lại regex mỗi lần gọi):

import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern pattern = Pattern.compile("\\d+"); // biên dịch một lần
String text = "Có 3 con mèo và 7 con chó";
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group()); // "3", rồi "7"
}
String text = "Số điện thoại: 0901-234-567";
String digitsOnly = text.replaceAll("\\D", ""); // \D = không phải chữ số -> xóa hết
System.out.println(digitsOnly); // 0901234567

String.split() cũng nhận một biểu thức chính quy, không chỉ chuỗi cố định:

String text = "one, two, three,four"; // dấu phẩy và số khoảng trắng không đều nhau
String[] parts = text.split(",\\s*"); // tách theo dấu phẩy, cho phép 0 hoặc nhiều khoảng trắng sau
System.out.println(Arrays.toString(parts)); // [one, two, three, four]
  • String.matches() để kiểm tra nhanh chuỗi có khớp mẫu regex hay không
  • Nhớ escape dấu \ thành \\ trong chuỗi Java khi viết regex
  • Pattern.compile() + Matcher hiệu quả hơn khi cần dùng lại cùng một mẫu nhiều lần
  • replaceAll()split() cũng nhận biểu thức chính quy làm tham số