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

Regular expressions (Biểu thức chính quy – viết tắt là Regex) là một chuỗi ký tự đặc biệt được dùng làm mẫu (pattern) để phân tích sự trùng khớp của một tập hợp các chuỗi nào đó. Regular expression được sử dụng trong nhiều ngôn ngữ lập trình như PHP, C#, Perl, Javascript,... để kiểm tra tính hợp lệ các dữ liệu đầu vào, hầu hết những ngôn ngữ lập trình trên đều cung cấp các thư viện hoặc hàm xử lý để lập trình viên có thể làm việc với Regular expression.

Regular expression dùng để làm gì?

Một số ví dụ thường dùng của Regular expression:

  • Trong lập trình, Regex dùng để kiểm tra tính hợp lệ của dữ liệu đầu vào như email (ví dụ @mailserver.com), số điện thoại (10 số hoặc 11 số và phải là số), chứng minh nhân dân, ngày tháng năm sinh (dd/mm/yyyy) ...
  • Trong một số phần mềm, Regex được áp dụng để xử lý chuỗi như tìm kiếm, thay thế chuỗi (giống như chức năng Find & Replace trong Microsoft Word) hoặc trích xuất chuỗi từ một chuỗi dài hơn.
  • ....

Cơ bản về cú pháp của Regular expression

Phần này, Passionery sẽ cố gắng giải thích cho bạn hiểu về cách sử dụng cơ bản của Regular expression. Về cơ bản, Regular expression chia làm 2 phần gồm Literal character (ký tự thường) và Meta character (siêu ký tự)

Để test các mẫu regex, bạn có thể vào 1 số website như Regexr, RegexPal.

Literal character (Ký tự thường)

Literal character là một biểu thức chứa một hoặc nhiều ký tự từ a đến z dùng để làm mẫu và so sánh trùng khớp với một chuỗi nào đó.

Ví dụ nếu ta có một Regex là ello và một chuỗi là helloworld, regex engine sẽ tìm và so sánh với chuỗi helloworld để tìm sự trùng khớp, nó sẽ khớp với chữ ello trong chuỗi helloworld

helloworld-regex

Meta character

Meta character là những ký tự đặc biệt có ý nghĩa như một mệnh lệnh nhất định đối với bộ phân tích (regex engine) trong Regular expression

Dưới đây mô tả ý nghĩa của Meta character thường dùng

[xyz]
Tìm và so sánh tất cả ký tự nằm trong dấu ngoặc vuông và trùng khớp với 1 ký tự trong dấu ngoặc vuông. Ví dụ: [31] sẽ trùng khớp với 3 hoặc 1, [0123456789] sẽ trùng khớp với bất kỳ ký tự nào trong khoảng từ 0 đến 9.
[a-z]
So sánh và trùng khớp với những ký tự nằm trong khoảng chỉ định. Ví dụ: [a-z] sẽ trùng khớp với bất kỳ ký tự nào trong khoảng từ a đến z
[^xyz]
So sánh và không trùng khớp với những ký tự nằm trong khoảng chỉ định. Dấu ^ (dấu mũ) nằm trong dấu ngoặc vuông là một dấu phủ định. Ví dụ: [^a-z] sẽ không trùng khớp với tất cả các ký tự nằm trong khoảng từ a đến z.
^
Trùng khớp với phần đầu của chuỗi đích. Ví dụ: ^a sẽ trùng khớp với chữ a trong chuỗi abc, ^\w+ sẽ trùng khớp với chữ đầu tiên – chữ "the" của chuỗi "The quick brown fox jumps over the lazy dog"
$
Trùng khớp với phần cuối của chuỗi đích. Ví dụ: c$ sẽ trùng khớp với chữ c trong chuỗi abc, \w+$ sẽ trùng khớp với chữ cuối – chữ "dog" của chuỗi "The quick brown fox jumps over the lazy dog"
+
Trùng khớp với 1 hoặc nhiều lần ký tự đứng trước nó
*
Trùng khớp với 0 hoặc nhiều lần ký tự đứng trước nó
?
Trùng khớp với 0 hoặc 1 lần ký tự đứng trước nó
.
Trùng khớp với 1 ký tự đơn bất kỳ ngoại trừ ký tự ngắt dòng (line-break). Ví dụ: .{5} sẽ trùng khớp với chuỗi nào gồm 5 ký tự bất kỳ
x{n}
Trùng khớp đúng với n lần ký tự đứng trước nó. n là một số không âm
x{n,}
Trùng khớp với ít nhất n lần ký tự đứng trước nó. n là một số không âm
x{n,m}
Trùng khớp với ít nhất n lần và nhiều nhất là m lần ký tự đứng trước nó. n và m là một số không âm và n <= m. Ví dụ: a{1,3} sẽ khớp với hah, haah, haaah nhưng không khớp với haaaah
x|y
Trùng khớp với x hoặc y. Ví dụ: slow|fast sẽ khớp với chữ slow hoặc fast trong chuỗi đích.
\b
Trùng khớp với toàn bộ ký tự đứng trước nó. Ví dụ: hello\b sẽ trùng khớp với toàn bộ từ hello trong chuỗi hello world nhưng sẽ không khớp với chuỗi helloworld
\B
Ngược lại với \b, \B sẽ không khớp với toàn bộ mà chỉ 1 phần ký tự đứng trước nó. Ví dụ: hello\B sẽ trùng khớp với chữ hello trong chuỗi helloworld nhưng sẽ không khớp với chuỗi hello world
\d
Trùng khớp các ký tự số (digit)
\D
Trùng khớp các ký tự không phải số (non-digit)
\s
Trùng khớp các ký tự khoảng trắng (whitespace) bao gồm khoảng trắng tạo ra bởi phím Tab
\S
Trùng khớp với ký tự không phải là khoảng trắng (non-whitespace)
\w
Trùng khớp với các ký tự là từ (word) bao gồm dấu _ (underscore) và chữ số
\W
Trùng khớp với các ký tự không phải là từ (non-word). Ví dụ: \W sẽ khớp với ký tự "%" trong chuỗi "100%"
\u
Trùng khớp với ký tự unicode. Ví dụ: \u00FA sẽ khớp với ký tự "ú", \u00F9 sẽ khớp với ký tự "ù"

Một số ví dụ về cách sử dụng của Regular Expression

Kiểm tra tính hợp lệ của địa chỉ email

[code]^([a-z0-9_\.\+-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$[/code]

Giải thích

Như quan sát, Regex trên được chia thành 3 phần. Đầu tiên là dấu ^ dùng để tìm và so sánh các ký tự đầu của chuỗi đích. Kế tiếp là nhóm đầu tiên của Regex ([a-z0-9_\.\+-]+), nhóm này sẽ trùng khớp nếu như những ký tự của ta từ a đến z, từ 0 đến 9 và gồm cả các dấu như _ (dấu gạch dưới), . (dấu chấm), dấu – (dấu gạch nối). Sau đó là dấu @, đây là một literal character dùng để tìm dấu @ trong chuỗi đích. Tiếp theo là nhóm thứ 2 ([\da-z\.-]+), tương tư nhóm đầu tiên nhóm này sẽ khớp với những ký tự từ a đến z, những ký tự số, dấu gạch dưới, dấu chấm và dấu gạch nối. Tiếp đến là dấu \., đây là một escape character dùng để gõ dấu . vào trong chuỗi (dùng để tránh nhầm lẫn với dấu chấm của Regex). Sau đó đến nhóm thứ 3 ([a-z\.]{2,6}) nhóm này khớp với 2 đến 6 ký tự từ a đến z vì có những domain dạng như .com.vn, .com.cn hay .co.uk chẳng hạn

Các chuỗi ví dụ khớp với Regex trên: email@gmail.com, email+email@gmail.com, email.email@yahoo.com

Kiểm tra tính hợp lệ của URL

[code]/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/[/code]

Giải thích

Nhóm đầu tiên ^(https?:\/\/)? cho phép URL bắt đầu "http://" hoặc "https://", bạn sẽ thấy dấu ? đằng sau chữ s để cho phép có hoặc không chữ s trong chuỗi http. Đứng trước nhóm là dấu ^ dùng để kiểm tra các ký tự đầu trong chuỗi, sau nhóm là dấu ? để cho phép có hoặc không chuỗi http trong URL.

Tiếp theo là nhóm thứ 2 ([\da-z\.-]+), nó khớp với các ký tự số, ký tự từ a-z, dấu gạch nối, dấu chấm, cuối nhóm là dấu + để so khớp 1 hoặc nhiều lần các ký tự trong nhóm. Tiếp đến là escape character \., dùng để gõ dấu chấm trong chuỗi Regex.

Sau đó là nhóm thứ 3 ([a-z\.]{2,6}) nhóm này chỉ khớp với 2 đến 6 ký tự từ a-z. Sau đó là nhóm thứ 4 ([\/\w \.-]*)* nhóm này cho phép các URL theo dạng như /example1/example2, bạn để ý ở cuối nhóm có 2 dấu *, dấu đầu tiên dùng để cho phép nó có hoặc không trong URL của ta (lặp lại 0 hoặc nhiều lần), dấu * tiếp theo cũng tương tự, cho phép nhóm lặp lại 0 hoặc nhiều lần trong URL. Cuối chuỗi là \/?$ dùng để cho phép có dấu / hay không trong URL của ta.

Các chuỗi ví dụ khớp với Regex trên: https://www.domain.com, domain.com.vn, domain.com/about

2 comments:

Powered by Blogger.