Developer Tools

Biểu Thức Chính Quy Cho Người Mới Bắt Đầu: Các Mẫu Dễ Hiểu

Giới thiệu thân thiện về cú pháp regex, các mẫu phổ biến để kiểm tra và tìm kiếm, cùng cách kiểm thử biểu thức mà không bị bối rối.

7 phút đọc

Code on a laptop screen

Biểu thức chính quy (regex) thường bị tiếng là khó đọc. Nhưng một khi bạn nắm được các thành phần cơ bản, chúng trở thành một trong những công cụ mạnh mẽ nhất trong bộ công cụ của lập trình viên — từ việc kiểm tra đầu vào của người dùng cho đến tìm kiếm trong các file log.

Biểu thức chính quy là gì?

Một regex là một mẫu mô tả một tập hợp các chuỗi ký tự. Bạn cung cấp cho bộ máy regex một mẫu và một chuỗi đích; nó sẽ cho bạn biết liệu (và ở đâu) mẫu đó khớp.

const pattern = /hello/i;
pattern.test("Hello World"); // true

Cờ /i giúp so khớp không phân biệt chữ hoa chữ thường. Trong JavaScript, các cờ được đặt sau dấu / đóng.

Các thành phần cơ bản

Ký hiệu Ý nghĩa Ví dụ Khớp với
. Bất kỳ ký tự nào (trừ xuống dòng) h.t hat, hit, hot
* Không hoặc nhiều lần ký tự trước ab*c ac, abc, abbc
+ Một hoặc nhiều lần ký tự trước ab+c abc, abbc (không khớp ac)
? Không hoặc một lần ký tự trước colou?r color, colour
\d Bất kỳ chữ số nào (0–9) \d{3} 123, 007
\w Ký tự từ (chữ cái, chữ số, _) \w+ hello, user_1
\s Khoảng trắng (dấu cách, tab, xuống dòng) \s+ khớp với khoảng trắng
^ Đầu chuỗi ^Hello Hello…
$ Cuối chuỗi world$ …world

Lớp ký tự

Dấu ngoặc vuông định nghĩa một tập hợp ký tự để so khớp:

[aeiou]     — bất kỳ nguyên âm nào
[A-Z]       — bất kỳ chữ hoa nào
[0-9a-f]    — bất kỳ chữ số hex nào
[^0-9]      — bất kỳ thứ gì KHÔNG phải chữ số

Nhóm và lựa chọn

Dấu ngoặc đơn nhóm các phần của mẫu, và | có nghĩa là "hoặc":

(cat|dog)s?   — khớp với cat, cats, dog, dogs
(\d{3})-(\d{4}) — khớp với 555-1234 và bắt từng phần

Các nhóm bắt được rất hữu ích cho việc trích xuất — lấy số điện thoại, ngày tháng, hoặc ID ra khỏi văn bản lộn xộn.

Các mẫu phổ biến trong thực tế

Email (đơn giản hóa)

^[^\s@]+@[^\s@]+\.[^\s@]+$

Mẫu này kiểm tra dạng "cái gì đó @ cái gì đó . cái gì đó" — đủ dùng cho việc kiểm tra phía client. Trong môi trường thực tế, hãy xác minh bằng kiểm tra gửi email thật sự với Email Validator của chúng tôi.

URL

https?:\/\/[^\s/$.?#].[^\s]*

Khớp với cả URL http lẫn https. Để tạo URL hợp lệ, xem URL & Query String Builder.

Số điện thoại (Mỹ)

\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}

Khớp với các định dạng như (555) 123-4567, 555.123.4567, và 555-123-4567.

Ngày tháng (YYYY-MM-DD)

\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])

Gỡ lỗi regex

Cách học tốt nhất là kiểm thử tương tác. Dán mẫu và chuỗi mẫu của bạn vào Regex Tester của chúng tôi — nó tô sáng các kết quả khớp theo thời gian thực, hiển thị các nhóm đã bắt, và giải thích từng phần trong mẫu của bạn.

Hãy viết mẫu đơn giản nhất giải quyết được vấn đề của bạn. Regex "khéo léo" rất khó bảo trì.

Những cạm bẫy về hiệu suất

Quay lui thảm họa (Catastrophic backtracking)

Các lượng từ lồng nhau như (a+)+b có thể khiến bộ máy thử số lượng đường dẫn theo cấp số nhân với đầu vào không khớp. Tránh các mẫu mà cùng một ký tự có thể được khớp bởi nhiều phần khác nhau trong biểu thức.

Neo đầu cuối tiết kiệm thời gian

Nếu bạn biết mẫu của mình phải khớp toàn bộ chuỗi, hãy dùng ^$. Nếu không có neo đầu cuối, bộ máy sẽ quét từng vị trí trong chuỗi để tìm kiếm một kết quả khớp một phần.

Bảng tham khảo nhanh

.           bất kỳ ký tự nào
\d \D       chữ số / không phải chữ số
\w \W       ký tự từ / không phải ký tự từ
\s \S       khoảng trắng / không phải khoảng trắng
[abc]       tập ký tự
[^abc]      tập phủ định
(group)     nhóm bắt
(?:group)   nhóm không bắt
a{3}        đúng 3 lần
a{2,5}      từ 2 đến 5 lần
a*? a+?     phiên bản lười biếng (non-greedy)
(?=ahead)   nhìn trước tích cực
(?!ahead)   nhìn trước phủ định

Regex là kỹ năng tích lũy theo thời gian. Hãy bắt đầu với các mẫu đơn giản, kiểm thử chúng trực quan, và chỉ tăng độ phức tạp khi thực sự cần thiết. Mọi ngôn ngữ lập trình đều hỗ trợ regex — một khi bạn học được cú pháp, nó có thể dùng được ở khắp nơi.