Regex (hay Regular Expression, biểu thức chính quy) là một công cụ mạnh mẽ để xử lý chuỗi trong nhiều ngôn ngữ lập trình như PHP, Javascript,… Thay vì tìm kiếm và thay thế các chuỗi ký tự cụ thể, Regex sử dụng các mẫu (pattern) để thực hiện công việc này. Regex đặc biệt hữu ích trong việc kiểm tra tính hợp lệ của dữ liệu nhập vào, ví dụ như địa chỉ email hoặc số điện thoại.
cu-phap-regular-expression
Mục Lục
Các Cú Pháp Cơ Bản Của Regular Expression
Hiểu một cách đơn giản, Regex là một chuỗi các ký tự mô tả một tập hợp các chuỗi ký tự khác, tuân theo các quy tắc và cú pháp nhất định. Tuy nhiên, không phải lúc nào cũng nên sử dụng Regex. Mỗi ngôn ngữ sẽ có cú pháp áp dụng Regex khác nhau.
Ứng Dụng Của Regex
Dưới đây là một vài ví dụ minh họa việc sử dụng Regex trong PHP và Javascript. Lưu ý rằng, cú pháp có thể khác nhau giữa các ngôn ngữ, nhưng ý tưởng chung là giống nhau.
Hàm preg_match trong PHP
Hàm preg_match trong PHP là một công cụ mạnh mẽ để làm việc với Regular Expression. Nó cho phép bạn kiểm tra xem một chuỗi có khớp với một mẫu nhất định hay không.
Cú pháp của hàm preg_match như sau:
preg_match($pattern, $subject, $matches);
Trong đó:
$pattern: Chuỗi Regex Pattern (mẫu biểu thức chính quy) mà bạn muốn so khớp.$subject: Chuỗi nguồn để so khớp với$pattern.$matches: Một mảng chứa kết quả trả về khi so khớp thành công.
Ví dụ 1: Kiểm tra một chuỗi có phải là số hay không
<?php
if (preg_match('/^[0-9]+$/', '123', $matches)) {
var_dump($matches);
}
?>
Kết quả:
array(1) {
[0]=>
string(3) "123"
}
Trong ví dụ này, mẫu /^[0-9]+$/ kiểm tra xem chuỗi có chứa chỉ các chữ số từ 0 đến 9 hay không. Dấu ^ biểu thị sự bắt đầu của chuỗi và dấu $ biểu thị sự kết thúc của chuỗi. Dấu + có nghĩa là một hoặc nhiều lần xuất hiện của ký tự số.
Ví dụ 2: Kiểm tra một chuỗi có phải là các ký tự thường hay không
<?php
if (preg_match('/^[a-z]+$/', 'topdev', $matches)) {
var_dump($matches);
}
?>
Kết quả:
array(1) {
[0]=>
string(6) "topdev"
}
Tương tự, mẫu /^[a-z]+$/ kiểm tra xem chuỗi có chứa chỉ các ký tự thường từ a đến z hay không.
Ví dụ 3: Kiểm tra một chuỗi có phải là các ký tự hoa hay không
<?php
if (preg_match('/^[A-Z]+$/', 'TOPDEV', $matches)) {
var_dump($matches);
}
?>
Kết quả:
array(1) {
[0]=>
string(6) "TOPDEV"
}
Mẫu /^[A-Z]+$/ kiểm tra xem chuỗi có chứa chỉ các ký tự hoa từ A đến Z hay không.
Tạo Regular Expression trong Javascript
Trong Javascript, Regular Expression là một đối tượng đặc biệt. Có hai cách để tạo một Regular Expression:
-
Sử dụng constructor
RegExp():var regexConst = new RegExp('abc'); -
Sử dụng dấu
/:/pattern/flagsTrong đó:
patternlà chuỗi Regular Expression.flagslà các thông số cấu hình cho chuỗi pattern:i: So khớp không phân biệt chữ hoa chữ thường (case-insensitive).g: So khớp toàn bộ chuỗi (global search).m: So khớp trên nhiều dòng (multiline).
Ví dụ: Tạo một pattern kiểm tra chuỗi có tồn tại chữ “topdev” hay không, không phân biệt chữ hoa chữ thường và tìm kiếm trên toàn bộ tài liệu.
var pattern = /topdev/igm;
Cách Viết Regex Chi Tiết
Regex cung cấp nhiều ký tự và cú pháp đặc biệt để thực hiện các thao tác phức tạp trên chuỗi, bao gồm so khớp, tách, tìm kiếm và thay thế.
Các Ký Tự Thường
Dưới đây là bảng tổng hợp các ký tự thường được sử dụng trong Regex:
| STT | Biểu thức | Mô tả | Ghi chú |
|---|---|---|---|
| 01 | a|b |
Khớp với a hoặc b |
|
| 02 | [0-9] |
Khớp với một trong các chữ số từ 0 đến 9 | |
| 03 | [a-z] |
Khớp với một trong các chữ cái từ a đến z (thường) | |
| 04 | [abc] |
Có thể khớp với a, b hoặc c |
|
| 05 | [^abc] |
Khớp với bất kỳ ký tự nào khác a, b và c |
Dấu ^ ở đầu ngoặc vuông biểu thị phủ định |
| 06 | d |
Số bất kỳ (tương đương [0-9]) |
|
| 07 | D |
Ký tự không phải là số (tương đương [^0-9]) |
|
| 08 | s |
Ký tự khoảng trắng | |
| 09 | S |
Ký tự không phải khoảng trắng (tương đương [^s]) |
|
| 10 | S+ |
Một hoặc nhiều ký tự không phải khoảng trắng | |
| 11 | w |
Ký tự chữ (tương đương [a-zA-Z0-9_]) |
|
| 12 | W |
Ký tự không phải chữ (tương đương [^w]) |
|
| 13 | b |
Ký tự thuộc a-z hoặc A-Z hoặc 0-9 hoặc _ (tương đương [a-zA-Z0-9_]) |
Các Ký Tự Đặc Biệt
| TT | Biểu thức | Mô tả | Ghi chú |
|---|---|---|---|
| 14 | . |
Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới | |
| 15 | ^ |
Bắt đầu của chuỗi | |
| 16 | $ |
Kết thúc của chuỗi | |
| 17 | / |
Bắt đầu hoặc kết thúc chuỗi regex | |
| 18 | | |
Sử dụng tương đương phép OR (hay dùng trong cặp ngoặc tròn) | |
| 19 | |
Biểu diễn một ký tự ngay sau nó từ ký tự đặc biệt thành ký tự thường và ngược lại (ví dụ: . sẽ khớp với dấu ., * sẽ khớp với ký tự * thay vì số lần lặp) |
Ví dụ: b sẽ trở thành ký tự b, * sẽ trở thành ký tự * chứ không phải số lần lặp nữa |
Lặp
| STT | Biểu thức | Mô tả | Ghi chú |
|---|---|---|---|
| 20 | * |
Xuất hiện 0 hoặc nhiều lần (tương đương {0,}) |
|
| 21 | + |
Xuất hiện 1 hoặc nhiều lần (tương đương {1,}) |
|
| 22 | ? |
Xuất hiện 0 hoặc 1 lần (tương đương {0,1}) |
|
| 23 | {X} |
Xuất hiện chính xác X lần (với X là một số không âm) |
|
| 24 | {X,Y} |
Xuất hiện trong khoảng từ X đến Y lần (với X, Y là các số không âm) |
|
| 25 | ? |
Khi thêm ? phía sau một ký tự lặp, nó sẽ tìm kiếm khớp nhỏ nhất |
Ví dụ: .*? sẽ khớp với ít ký tự nhất có thể |
Khớp Nhóm
| STT | Biểu thức | Mô tả | Ghi chú |
|---|---|---|---|
| 26 | () |
Khớp với một nhóm các ký tự và nhớ kết quả khớp (capturing group) | Ví dụ: (e|g)mail sẽ khớp với “email” hoặc “gmail”. /(ab) (cd) 1 2/ sẽ khớp với “ab cd ab cd” (1 và 2 lần lượt tham chiếu đến nhóm khớp thứ nhất và thứ hai) |
| 27 | (?:x) |
Khớp với x nhưng không nhớ kết quả khớp (non-capturing group) |
(?:foo) 1 sẽ không khớp với “foo foo”, trong khi (foo) 1 sẽ khớp |
| 28 | x(?=y) |
Chỉ khớp x nếu ngay sau x là y (positive lookahead assertion) |
“hello” sẽ khớp với /h(?=e)/ (kết quả trả về chỉ có “h”) |
| 29 | x(?!y) |
Chỉ khớp x nếu ngay sau x không phải là y (negative lookahead assertion) |
Regex là một công cụ mạnh mẽ và linh hoạt, nhưng nó cũng có thể trở nên phức tạp và khó hiểu. Việc nắm vững các cú pháp và ký tự đặc biệt là rất quan trọng để sử dụng Regex một cách hiệu quả.
