[Bài đọc] Regular Expression / Regex – Biểu thức chính quy

Tổng quan

Biểu thức chính quy (Regular Expression)  thường được gọi là Regex hoặc RegExp. Là thuật toán khớp mẫu mạnh mẽ có thể được thực hiện trong một biểu thức. Nó giúp bạn trong tiết kiệm được rất nhiều thời gian khi xây dựng các trang web động.

Hầu hết các ngôn ngữ lập trình đều hỗ trợ Regex như Javascript, PHP, Java… Thậm chí RegExp còn rất phổ biến trong các ứng dụng, công cụ khác nhau như rewrite URL, tìm kiếm và thay thế trong các IDE…

>>> Xem ngay SÁCH LẬP TRÌNH PHP TỪ CĂN BẢN ĐẾN NÂNG CAO

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

Biểu thức chính quy là một nhóm các ký tự, ký hiệu nó được sử dụng để tìm kiếm văn bản (text).

Một biểu thức chính quy là một mẫu nó tương đồng quy luật với một chuỗi từ trái qua phải. Biểu thức chính quy tên tiếng anh là Regular Expression  thường gọi tắt là regex hoặc regexp

Trong lập trình nó được dùng với các hàm xử lý chuỗi, xử lý văn bản với các tác vụ cụ thể như: tìm và thay thế chuỗi, kiểm tra tính hợp lệ của dữ liệu, trích xuất chuỗi con từ một chuỗi … 

Tại sao lại sử dụng biểu thức chính quy?

  • Biểu thức chính quy đơn giản hóa việc xác định các mẫu trong chuỗi dữ liệu bằng cách gọi một hàm duy nhất. Điều này giúp chúng ta tiết kiệm thời gian lập trình.
  • Khi xác thực đầu input của người dùng nhập vào như username, password, email, tên miền, số điện thoại, địa chỉ IP…
  • Highlight từ khóa trong kết quả tìm kiếm.
  • Khi tạo mẫu HTML tùy chỉnh. Biểu thức chính quy thông thường có thể được sử dụng để xác định các tag và thay thế chúng bằng dữ liệu thực tế.
  • Đặc biệt, sử dụng biểu thức chính quy tăng performance của chương trình rất nhiều lần.

Khai báo biểu thức chính quy

Để khai báo một chuỗi Regular Expression ta chỉ cần khai báo bắt đầu bằng ký tự / và kết thúc cũng là ký tự /

Cú pháp: $pattern = ‘/các ký tự của BTCQ- metacharacters/flags’;

Tham khảo ví dụ sau đây: 

// Partern kiểm tra trong subject có tồn tại chuỗi abc không
$pattern = '/abc/';
$subject = 'abc';
if (preg_match($pattern, $subject)){
    echo 'Chuỗi regex so khớp';
}

Trong ví dụ trên, $pattern = ‘/abc/’ có ý nghĩa là tìm trong chuỗi $subject có chứa chuỗi ‘abc’ hay không. Vì chúng ta truyền vào $subject là ‘abc’ cho nên kết quả thu được sẽ là thông báo có chứa chuỗi. Hàm preg_match sẽ được giới thiệu ở sau.

Metacharactes

Các ký tự dùng trong biểu thức chính quy được gọi là metacharacters. Sau đây là một số ký tự cơ bản thường hay sử dụng trong biểu thức chính quy: 

MetacharacterMô tảVí dụ
^Bắt đầu của chuỗi /^a/ sẽ khớp với các chuỗi bắt đầu bằng chữ a, như: a, ab, aabc…
$Kết thúc của chuỗi /a$/ sẽ khớp với chuỗi kết thúc là ký tự, như a, ba, cha, …
*Ký tự / cụm ký tự đứng trước lặp lại 0 đến nhiều lần. /^a*$/ sẽ khớp với chuỗi chứa 0, 1 hay nhiều chữ a, như: chuỗi rỗng, a, aa, aaaa,…
+ Yêu cầu các ký tự đứng trước xuất hiện ít nhất 1 lần /goo+gle/ sẽ khớp với google, gooogle
?Tùy chọn có hay không cho mẫu phía trước/^a?$/ sẽ khớp với chuỗi rỗng (“”) hoặc chuỗi chứa chữ a (“a”)
{n,m}Lặp tối thiểu là n lần, tối đa là m lần/^a{1,3}$/ sẽ khớp với a, aa, aaa
\Sử dụng để ký tự sau nó là nguyên thủy, biểu diễn ký tự đặc biệt [ ] ( ) { } . * + ? ^ $ \ | /google+\.com/ sẽ coi dấu dấu là dấu chấm theo nghĩa đen, ví dụ: google.com
|Biểu diễn thay thế, phép toán orx|y sẽ khớp x hoặc y
[]Tập hợp ký tự. Phù hợp nếu có bất kỳ ký tự nào trong dấu [] /[abc]/ sẽ khớp với a,b,c
[^]Tập hợp ký tự phủ định. Phù hợp nếu không có ký tự nào trong []/[^xyz]/ sẽ khớp nếu loại trừ các ký tự xyz
(xyz)Biểu diễn một nhóm ký tự/^(xyz)$/ sẽ khớp với xyz
.Khớp với bất kỳ ký tự đơn nào trừ dòng mới/^a.$/ khớp với an, am,…
Khoảng liên tiếp các giá trịx-z tức các giá trị x,y,z
a-z Khớp với các ký tự thường từ a-z /a-z/ sẽ khớp với các ký tự thường từ a-z
A-Z Khớp với các ký tự Hoa từ A-Z /A-Z/ sẽ khớp với các ký tự chữa hoa A-Z
0-9 Khớp bất kỳ số nào trong khoảng từ 0 đến 9 /0-9/ sẽ khớp với các ký số

Ký hiệu tắt cho tập hợp

Viết tắtDiễn tả
\wChữ,sô, và _, tương đương với: [a-zA-Z0-9_]
\WNgoài bảng chữ cái, tương đương với: [^\w]
\dCác số: [0-9]
\DKhông phải số: [^\d]
\sLà ký tự trắng, tương đương với: [\t\n\f\r\p{Z}]
\SKhông phải ký tự trắng: [^\s]

Các cờ – flags

CờDiễn tả
iThiết lập không phân biệt chữ hoa chữ thường
gTìm kiếm toàn chuỗi.
mSo khớp trên từng dòng đối với văn bản đa dòng và có sử dụng cặp “^$”


Các cờ này được đưa vào mẫu theo dạng /RegExp/flags

"/The/gi" => The fat cat sat on the mat.

"/.(at)/" => The fat cat sat on the mat.

"/.(at)/g" => The fat cat sat on the mat.

Biểu thức ?= lookahead

Lookahead ?= cho thêm vào để lọc kết quả.

Ký hiệu ?=. Phần đầu của biểu thức phải được tiếp nối bởi biểu thức lookahead.
Ví dụ (T|t)he(?=\sfat) thì lookahead là (?=\sfat) – nghĩa là T hoặc t theo sau là he vậy tìm được 2 kết quả. Nhưng do có biểu thức lookahead, điều này thì kết quả phù hợp là chỉ lấy khi theo sau nó là chuỗi fat

(T|t)he => The fat cat sat on the mat.
(T|t)he(?=\sfat) => The fat cat sat on the mat.

Biểu thức ?! phủ định lookahead

Ký hiệu là ?!, nghĩa là lấy kết quả mà đi sau nó không có chuỗi lookahead

(T|t)he(?!\sfat) => The fat cat sat on the mat.

Biểu thức (?<=) lookbehind

Sử dụng để lấy các phù hợp mà đi trước là một mẫu cũ thể. (?<=(T|t)he\s)(fat|mat) có nghĩa lấy tất cả các từ fat hoặc mat sau các từ The hoặc the

(?<=(T|t)he\s)(fat|mat) => The fat cat sat on the mat.

Biểu thức (?<!) phủ định lookbehind

Sử dụng để lấy các phù hợp mà đi trước không có một mẫu lookbehind chỉ ra.

(?<!(T|t)he\s)(cat) => The cat sat on cat.

Tham khảo: 

– https://www.guru99.com/php-regular-expressions.html

– https://www.tutorialspoint.com/php/php_regular_expression.htm

Trả lời

Email của bạn sẽ không được hiển thị công khai.