Biểu thức chính qui - Regex

03cd82 2024

1) Tình huống thực tế

a. Bạn có 1 trang web cho phép người dùng đăng bài, viết bình luận... sẽ khó tránh trường hợp người dùng viết những câu từ tục tĩu... Bạn cần kiểm soát nội dung? Bạn không thể đọc hết được nhanh chóng nội dung người dùng viết khi mà web của bạn có đông người dùng.

==> Nhu cầu: Cần tự động kiểm tra khớp với các từ xấu trong nội dung để thay thế thành dấu ****

b. Bạn đăng ký tài khoản ở các trang web họ luôn yêu cầu bạn nhập giới hạn như: Tên đăng nhập chỉ bao gồm chữ cái và số, không chứa ký tự đặc biệt, không chứa khoảng trống (dấu cách). Hoặc password bắt buộc phải có giới hạn ít nhất 6 ký tự, ít nhất có 1 ký tự chữ cái in hoa, ít nhất có 1 ký tự số ... 

Làm sao mà biết người dùng nhập đúng yêu cầu như vậy?

Còn nhiều tình huống khác như kiểm tra định dạng email, url, ip, tên file, tên thư mục... hoặc tìm kiếm, thay thế, tách chuỗi....

2) Dùng biểu thức chính qui (regex) để giải quyết các vấn đề trên

Regex là gì?

Là một mẫu biểu thức gồm các ký tự được sắp xếp theo một quy luật nào đó để kiểm tra khớp với một chuỗi hoặc tìm trong một chuỗi nào đó....

Mỗi ngôn ngữ lập trình sẽ có một chút khác nhau về cách viết biểu thức, tuy nhiên quy luật thì giống nhau.

Ví dụ đơn giản kiểm tra trong chuỗi có chứa chữ h hay không (Dùng ngôn ngữ javascript) 

/h/

 

3) Ý nghĩa các ký tự dùng xây dựng biểu thức

Ký tự đại diện dùng để thay thế cho ký tự khác


Dấu chấm . đại diện bất kỳ ký tự nào cũng được
\d đại diện cho một ký tự số từ 0-9, tương đương với cách viết [0-9]
\D đại diện cho một ký tự không phải là kiểu số từ 0-9, ngược lại với "\d"
\s đại diện cho một ký tự là khoảng trắng
\S đại diện cho một ký tự không phải là khoảng trắng, ngược lại với "\s"
\w đại diện cho một ký tự từ A-Z hoặc a-z hoặc 0-9, hoặc ký tự gạch dưới "_"  (không phải các chữ có dấu tiếng Việt)
\W đại diện cho một ký tự không phải là từ A-Z, a-z, 0-9, ký tự gạch dưới "_"  (không phải các chữ có dấu tiếng Việt)
 

Giới hạn số lần xuất hiện của một ký tự:

x? nghĩa là một ký tự "x" có thể xuất hiện 1 lần hoặc không xuất hiện lần nào
x* nghĩa là ký tự "x" có thể xuất hiện 1 lần hoặc nhiều lần hoặc không xuất hiện cũng được
x+ nghĩa là ký tự "x" bắt buộc phải xuất hiện ít nhất 1 lần, nhiều nhất thì không biết
x{n} nghĩa là ký tự "x" xuất hiện đúng giới hạn n lần
x{n,} nghĩa là ký tự "x" xuất hiện ít nhất n lần, nhiều nhất thì không biết
x{n,m} nghĩa là ký tự "x" xuất hiện ít nhất n lần và nhiều nhất m lần
Chú ý: Không nhất thiết là ký tự x, có thể là một nhóm ký tự nào đó...

Ghép nối danh sách ký tự:

[...] trong dấu ngoặc vuông liệt kê danh sách những ký tự hợp quy tắc, có thể dùng dấu gạch giữa "-"giữa 2 ký tự để thể hiện danh sách những ký tự trong khoảng 2 ký tự theo vị trí ASCII của ký tự. Ví dụ: [0-9] là giống như [0123456789]
[^...] chức năng thì ngược lại với "[...]" thay vì liệt kê những ký tự hợp quy tắc, nó cho biết bất kỳ ký tự nào ngoài danh sách các ký tự trong dấu ngoặc vuông

Xác định vị trí

Ký tự  ^  dùng để bắt đầu một chuỗi
Ký tự  $ dùng để kết thúc một chuỗi
Ký tự   \b  và \B bao gói từ (bạn có thể hiểu là bắt đầu tính từ vị trí dấu cách)

Vấn đề khác

Dấu ngoặc tròn ( ...) dùng gom nhóm các ký tự hợp lệ.

Dấu xổ đứng | dùng làm toán tử hoặc. Ví dụ (a|b)  nghĩa là trong mẫu có thể xuất hiện ký tự a hoặc xuất hiện ký tự b

Nếu muốn giới hạn bắt buộc phải xuất hiện ký hiệu nào đó trong chuỗi thì dùng cấu trúc   (?=.*d)        nghĩa là bắt buộc phải có ít nhất 1 chữ số trong chuỗi.(Bạn tham khảo thêm Biểu thức chính qui kiểm tra hợp lệ của password  )

 

 

4) Cách xây dựng một biểu thức chính qui

Giả sử kiểm tra một chuỗi có hợp lệ theo chuẩn của một số điện thoại đầu 09 và là số 10 số. Ví dụ: 0912345678 và 0988888888 đều là số điện thoại hợp lệ.

Phân tích:

- Chuỗi phải bắt đầu bằng số 09. 
- Chuỗi còn lại 8 chữ số thì có thể nhận bất kỳ số nào trong các chữ số từ 0->9

Cách viết:

- Dùng ký tự ^ và $ để đánh dấu bắt đầu và kết thúc chuỗi
- Dùng ký tự [   ] để liệt kê danh sách ký tự hợp lệ
- Dùng {  }  để viết giới hạn số lượng ký tự
- Ghép các ký tợ lại với nhau tạo thành chuỗi. Chú ý không viết dấu cách. Nếu trong chuỗi có xuất hiện dấu cách thì mới viết dấu cách.

^09[0-9]{8}$

hoặc dùng ký tự \d thay thế cho [0-9]

^09\d{8}$

Bạn hãy thử dùng công cụ javascript ở địa chỉ https://zezo.dev/tool/regex-cheatsheet.html để thử nghiệm nhé.

Đối với javascript, php thì viết biểu thức sẽ cần có thêm 2 ký tự gạch chéo bao gói ở đầu và cuối chuỗi biểu thức. VD: 

/^09[0-9]{8}$/

Chúc bạn thành công và sáng tạo!

 

 

Nguồn: zezo.dev