Regex là các mẫu [pattern] thay vì các chuỗi cụ thể được sử dụng tìm/thay thế [Find/Replace]. Là một công cụ cực mạnh cho xử lí chuỗi trong Php, javascript… Ví dụ: Khi kiểm tra tính hợp lệ của email hoặc số điện thoại thì điều bạn nghĩ tới đầu tiên chính là regex. Regex là viết tắt của Regular Expression, tên thuần Việt là biểu thức chính quy.
2.Các cú pháp cơ bản Regular Expression
Nói chung là Regex còn nhiều ứng dụng hữu ích khác, tóm gọn lại một chút là hiểu đơn giản thì regex là một chuỗi các kí tự miêu tả một bộ các chuỗi ki tự khác, theo những quy tắc và cú pháp nhất định.
Không phải lúc nào cũng nên dùng regex, mỗi ngôn ngữ sẽ có cú pháp áp dụng regex khác nhau, nhưng không sao vai trò của ngôn ngữ ở đây không quan trọng lắm.
Học Regular Expression và cuộc đời bạn sẽ bớt khổ [Updated v2.2]
3.Ứng dụng Regex
Một số ví dụ nhẹ nhàng cho Php hoặc Javascript nhé, như đã nói vai trò của ngôn ngữ không quan trọng lắm, 1 chút google sẽ ra các đoạn code mình cần dùng.
Nhắc lại: Nguyên tắc hoạt động của biểu thức RegEx là so khớp dựa vào mẫu [pattern], mẫu được xây dựng từ các quy tắc căn bản của biểu thức RegEx. Và để các bạn nắm rõ regular expression là gì thì có một hàm xử lý Regular Expression trong php đó là hàm preg_match, sau đó đưa ra một vài ví dụ nhỏ để các bạn thực hành trước khi tìm hiểu các phần nâng cao hơn.
3.1 Hàm Preg_match trong php
Cú pháp là: preg_match[$pattern, $subject, $matches]
$pattern
là chuỗi Regex Patternarray 0 => string '123' [length=3]
0 là chuỗi nguồn để chúng ta so khớp với$pattern
array 0 => string '123' [length=3]
2 là danh sách kết quả trả về đúng khi so khớp 2 chuỗi trên
VD 1: kiểm tra mội chuỗi là số
if [preg_match['/^[0-9]+$/', '123', $matches]]{ var_dump[$matches]; }
Kết quả:
array 0 => string '123' [length=3]
VD 2: Kiểm tra một chuỗi là các ký tự thường
if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{ var_dump[$matches]; }
Kết quả
array 0 => string 'topdev' [length=6]
VD 3: Kiểm tra một chuỗi là các ký tự hoa
if [preg_match['/^[A-Z]+$/', 'TOPDEV', $matches]]{ var_dump[$matches]; }
Kết quả
array 0 => string 'TOPDEV' [length=6]
3.2 Tạo 1 Regular Expressions trong JS
Trong Javascript thì Regular Expression là một chuỗi nhưng nó không được bao quanh bởi cặp dấu nháy đơn
array 0 => string '123' [length=3]3 hoặc nháy kép
array 0 => string '123' [length=3]4 mà nó được bao quanh bởi cặp dấu
array 0 => string '123' [length=3]5. Có 2 cách tạo:
Cú pháp:
array 0 => string '123' [length=3]6
VD:
var regexConst = new RegExp['abc'];
Hoặc sử dụng dấu
array 0 => string '123' [length=3]5
Cú pháp:
array 0 => string '123' [length=3]8
Trong đó:
array 0 => string '123' [length=3]
9 là chuỗi Regular Expressionif [preg_match['/^[a-z]+$/', 'topdev', $matches]]{ var_dump[$matches]; }
0 là thông số cấu hình cho chuỗi pattern và nó có các giá trị:if [preg_match['/^[a-z]+$/', 'topdev', $matches]]{ var_dump[$matches]; }
1 : so khớp không quan tâm đến chữ hoa chữ thườngif [preg_match['/^[a-z]+$/', 'topdev', $matches]]{ var_dump[$matches]; }
2 : so khớp toàn bộ chuỗi cần tìmif [preg_match['/^[a-z]+$/', 'topdev', $matches]]{ var_dump[$matches]; }
3 : so khớp luôn cả các dữ liệu xuống dòng [multiline]
Ví dụ: Pattern kiểm tra chuỗi có tồn tại chữ “topdev” không, không phân biệt chữ hoa chữ thường và tìm toàn bộ tài liệu.
var pattern = /topdev/igm;
- pattern là topdev
- flags là igm
4.Cách viết Regex chi tiết
Trong Regex có vài cái khá là điển hình và được sử dụng rất nhiều bao gồm so khớp chuỗi, tách chuỗi, tìm kiếm trong chuỗi, thay thế chuỗi… Các cách sử dụng chi tiết Regex trong Javascript bạn có thể tham khảo chi tiết tại đây nhé hoặc ở đây.
Biểu thức chính quy hay là Regular Expression[RegEx], là một chuỗi các ký tự tạo thành một mẫu tìm kiếm, được sử dụng để xử lý một chuỗi và kiểm tra chuỗi một cách chi tiết hơn. Việc xử lý chuỗi sẽ được thông qua một biểu thức riêng, biểu thức này lại có những nguyên tắc riêng và ta phải tuân thủ theo nguyên tắc đó thì biểu thức của ta mới hoạt động được.
Biểu thức chính quy có thể được sử dụng để thực hiện tất cả các hoạt động tìm kiếm văn bản hay thay thế văn bản. Biểu thức chính quy có thể là một ký tự đơn hoặc một mẫu phức tạp hơn.
2. Cú pháp trong biểu thức chính quyTrong PHP, biểu thức chính quy là các chuỗi gồm dấu phân cách, một mẫu hoặc các biểu mẫu tùy chọn.
Ý nghĩaVí dụ^Bắt đầu chuỗi nhập^B$Kết thúc chuỗi nhậpX$.Bất kỳ ký tự nào ngoại từ ký tự xuống dòng[\n]i.ation*Ký tự trước có thể lặp lại 0 hoặc nhiều lầnra*t+Ký tự trước có thể lặp lại 1 hoặc nhiều lầnra+t?Ký tự trước có thể lặp lại 0 hoặc 1 lầnra?t\sBất kỳ ký tự khoảng trắng\sa\SBất kỳ ký tự nào không phải là khoảng trắng\SF\bTừ biênion\b\BBất kỳ ký tự nào không phải là từ biên\BX\B3. Hàm thông dụng trong biểu thức chính quy trong PHP3.1. Hàm preg_match
Cú pháp: preg_match[$pattern, $subject, $matches, $flags, $offset];
Trong đó:
- $pattern : là chuỗi của biểu thức chính quy.
- $subject : là chuỗi cần so khớp.
- $matches : là kết quả trả về, được truyền vào dưới dạng tham chiếu[có thể trống].
- $flags : là tham số chỉ ra vị trí cắt chuỗi so khớp[có thể trống].
- $offset : là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi[có thể trống].
Hàm này sẽ trả về 1 cho ta nếu chuỗi được tìm thấy và ngược lại trả về 0 nếu không tìm thấy chuỗi[ta có thể coi tương tự như True và False]. Sử dụng biểu thức chính quy để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường trong một chuỗi.
Ví dụ 1:
Ví dụ 2: kiểm tra một chuỗi là ký tự thường
if [preg_match['/^[a-z]+$/', 'laptrinhtudau', $matches]]{ var_dump[$matches]; }
Ví dụ 3 : kiểm tra một chuỗi là ký tự hoa
if [preg_match['/^[A-Z]+$/', 'LAPTRINHTUDAU', $matches]]{ var_dump[$matches]; }
3.2. Hàm preg_match_all
Cú pháp: preg_match[$pattern, $subject, $matches, $flags, $offset];
Trong đó:
- $pattern : là chuỗi của biểu thức chính quy.
- $subject : là chuỗi cần so khớp.
- $matches : là kết quả trả về, được truyền vào dưới dạng tham chiếu[có thể trống].
- $flags : là tham số chỉ ra vị trí cắc chuỗi so khớp[có thể trống].
- $offset : là tham số chỉ ra vị trí bắt đầu của việc so khớp chuỗi[có thể trống].
Hàm này giúp ta so khớp tất cả các đoạn khớp trong chuỗi. Còn preg_match thì sẽ chỉ so khớp đoạn đầu tiên còn phần sau nó sẽ bỏ qua. Hàm preg_match_all sẽ trả về số lần mẫu được tìm thấy trong chuỗi, cũng có thể là 0.
Ví dụ:
3.2. Hàm preg_replace
Cú pháp: preg_replace[$pattern, $replacement, $subject, $limit, $count];
Trong đó:
- $pattern : là chuỗi regex cần tìm kiếm.
- $replacement : là chuỗi thay thế cho chuỗi vừa tìm được.
- $subject : là chuỗi mà ta cần tìm và thay thế.
- $limit : là giới hạn số lần thay thế chuỗi mặc định là -1 là không giới hạn[có thể bỏ trống].
- $count : là số lần thay thế chuỗi khi sử dụng một hàm, dưới dạng tham chiếu[có thể bỏ trống].
Ví dụ:
Hàm này sẽ giúp ta trả về một chuỗi mới trong đó các mẫu phù hợp đã được thay thế bằng một chuỗi khác.
4. Cách viết Regex chi tiếtTôi sẽ trình bày phần này ra thành từng mục nhỏ và ở trong các bảng để các bạn dễ nhìn và có thể so sánh chúng dễ hơn nhé!
4.1. Sửa đổi biểu thức
Biểu thứcÝ nghĩaiTìm kiếm mà không phân biệt chữ hoa chữ thườngmTìm kiếm nhiều dònguĐối sánh chính xác các mẫu được mã hóa UTF-84.2. Ký tự thường
Biểu thứcÝ nghĩaChú ýa | bTìm một ký tự khớp với a hoặc b[0 – 9]Tìm một ký tự khớp với số từ 1 đến 9[a – z]Khớp với những chữ từ a tới z[abc]Có thể khớp với a, b hoặc c[^abc]Không khớp với a b hay cDấu ^ xuất hiện sau dấu ngoặc vuông thì là phủ định\dSố bất kỳThay thế cho [0-9]\DKý tự không phải là sốThay thế [^0-9]\sKý tự khoảng trắng\SKhông phải ký tự khoảng trắngThay thế [^\s]\wKý tự chữ\WKý tự không phải chữThay thế [^\w]\bKý tự thuộc a-z hoặc A-Z hoặc 0-9 hoặc _4.2. Ký tự đặc biệt
Biểu thứcÝ nghĩa|Tìm kết quả phù hợp cho bất kỳ một trong các mẫu [tương tự or].Chỉ tìm một trường hợp của bất kỳ ký tự nào, khớp với bất kỳ ký tự đơn nào ngoài \^Tìm kết quả phù hợp ở đầu một chuỗi$Tìm kết quả phù hợp ở cuối chuỗi\dTìm một chữ số\sTìm một ký tự khoảng trắng\bTìm một kết quả phù hợp ở đầu một từ hoặc cuối một từ\uxxxxTìm ký tự unicode được chỉ định bởi số lục phân xxxx/Bắt đầu hoặc kết thúc chuỗi regex\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ại4.3. Bộ định lượng
Biểu thứcÝ nghĩan+Khớp với bất kỳ chuỗi nào có chứa ít nhất một nn*Khớp với bất kỳ chuỗi nào không có hoặc có nhiều lần xuất hiện của nn?Khớp với bất kỳ chuỗi nào có chứa 0 hoặc một lần xuất hiện của nn{x}Khớp với bất kỳ chuỗi nào chứa một chuỗi X nn{x,y}Khớp với bất kỳ chuỗi nào có chứa chuỗi X với chuỗi Y nn{x,}Đối sánh bất kỳ chuỗi nào có chứa ít nhất một chuỗi gồm X n4.4. Khớp nhóm
Biểu thứcÝ nghĩa[]Chọn các phần từ của mẫu được sử dụng làm đối sánh[? : x]Khớp với x nhưng không rõ kết quả khớpx[?=y]Chỉ khớp với x nếu ngay sau x là yX[?!y]Chỉ khớp với x nếu ngay sau x không là y5. Ưu điểm và nhược điểm của biểu thức chính quyKhông chỉ PHP mà ở các ngôn ngữ khác đều hỗ trợ regex. Và qua những gì tôi đã giới thiệu ở trên ta sẽ rút ra một số ưu nhược điểm của regex nhé!
5.1. Ưu điểm
Vì biểu thức chính quy có tác dụng để so khớp các dữ liệu đầu vào một cách chi tiết và cụ thể nên ta có thể rằng buộc được chi tiết các dữ liệu đầu vào một cách nhanh chóng và chính xác.
5.2. Nhược điểm
Chúng ta sẽ khó mà nắm bắt được vì biểu thức chính quy khá trìu tượng và rắc rối. Nó đòi hỏi ta phải có một chút tư duy logic, và sự tập trung nếu không ta có thể sẽ tạo ra biểu thức không khớp như kết quả mà ta muốn.