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

Biểu thức chính quy trong Js hay còn viết là Js RegExp – Regular Expression. Nó là các mẫu tìm kiếm các bộ ký tự được kết hợp với nhau trong chuỗi ký tự. Trong JavaScript thì biểu thức chính quy cũng đồng thời là các đối tượng, tức là khi bạn tạo ra một biểu thức chính quy là bạn có một đối tượng tương ứng. Đây là một thư viện nâng cao được tích hợp sẵn trong đối tượng RegExp của Javascript.

Các mẫu này được sử dụng khá nhiều trong JavaScript như phương thức exec và test của RegExp, hay phương thức match, replace, search, và split của String. 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 … Hầu hết các ngôn ngữ lập trình đều hỗ trợ Regex như PHP, C#, JAVA …

2. Tạo một biểu thức chính quy trong JavaScript

Ta sẽ có 2 cách để tạo một biểu thức chính quy trong Js đó là:

  • Tạo theo cách thông thường bằng cách sử dụng cụm từ thông thường.
  • Sử dụng hàm khởi tạo RegExp() . Ở đây có nghĩa là ta sẽ tạo một đối tượng RegExp().

Với việc sử dụng cụm từ thông thường. Ta chỉ cần tạo biểu thức chính quy bao gồm một mẫu nằm giữa dấu gạch chéo / .

Ví dụ: var re = /ab+c/;

Các đoạn mã chứa các mô tả chính quy thuần sẽ được dịch thành các biểu thức chính quy. Các biểu thức chính quy được dịch ra này sẽ được coi như các hằng số, tức là không phải tạo lại nhiều lần, điều này giúp cho hiệu năng thực hiện tốt hơn.

Về sử dụng hàm khởi tạo RegExp() thì đơn giản ta chỉ cần gọi một hàm ra là xong:

const reguarExp = new RegExp('abc)

Hay: var re = new RegExp("ab+c");

Với cách này, các biểu thức chính quy sẽ được dịch ra lúc thực thi chương trình nên hiệu năng không đạt được như với việc sử dụng cách mô tả chính quy thuần. Nhưng ưu điểm lớn nhất nó là ta có thể thay đổi được nó. Như vậy trong nhiều bài toán cần thay đổi nhiều ta có thể sử dụng nó.

3. Cách viết một mẫu biểu thức chính quy trong JavaScript

Một mẫu biểu thức chính quy là một tập các kí tự thường, như /abc/, hay một tập kết hợp cả kí tự thường và kí tự đặc biệt như /ab*c/ hoặc /Chapter (\d+).\d*/ .

3.1. Sử dụng một mẫu đơn giản

Các mẫu đơn giản là các mẫu có thể được xây dựng từ các kí tự có thể thể tìm kiếm một cách trực tiếp.

Ví dụ như ta có mẫu /abcd/ . Ta sẽ tìm kiếm đoạn abcd theo đúng thứ tự ở trong chuỗi. Vậy ta sẽ tìm thấy nó ở những chuỗi như: “đây là abcd nè ” hay ” chuỗi này hơi dài abcdefgh” . Nhưng với những chuỗi như ” hello abc def gh ” thì sao? Nó sẽ không trùng khớp vì chuỗi này đúng là có chứa abcd. Nhưng nó lại không đúng thứ tự. Trong chuỗi này thứ tự của nó là “abc de” còn mẫu ta là “abcd” .

3.2. Sử dụng các ký tự đặc biệt

Các mẫu có thể chứa các kí tự đặc biệt cho các mục đích tìm kiếm nâng cao mà tìm kiếm trực tiếp sẽ khó khăn. Ở đây các siêu ký tự được sử dụng. Siêu ký tự là các ký tự được RegEx diễn giải theo một cách đặc biệt. Đây là danh sách các siêu ký tự: [] . ^ $ * + ? {} () \ | 

Bảng dưới đây mô tả đầy đủ các kí tự đặc biệt có thể dùng với biểu thức chính quy.

Biểu thức chính quy Ý nghĩa
. Khới (match) với bất kỳ ký tự nào
^regex Biểu thức chính quy khớp tại điểm bắt đầu
regex$ Biểu thức chính quy khớp ở cuối dòng
[abc] Thiết lập định nghĩa có thể thiết lập với a hoặc b hoặc c
[abc] [vz] Thiết lập định nghĩa có thể thiết lập với a hoặc b hoặc c theo sau là v hay z
[^abc] Dấu ngã xuất hiện đầu tiên thì nó có nghĩa là phủ nhận. Ở đây nó có nghĩa là phủ nhận bất kỳ ký tự nào trừ a hoặc b hoặc c
[a-d1-7] Phạm vi phù hợp với một chuỗi giữa a và điểm d con số từ 1 đến 7
X | Z Tìm X hoặc Z
XZ Tìm X và theo sau là Z
$ Kiểm tra kết thúc dòng
\d Số bất kỳ viết ngắn gọn cho [0-9]
\D Ký tự không phải số viết ngắn gọn [^0-9]
\s Ký tự khoảng trắng. Viết ngắn gọn cho [ \t\n\x0b\r\f ]
\S Ký tự không phải khoảng trắng. Viết gọn cho [^\s]
\w Ký tự chữ. Viết gọn cho [a-zA-Z_0-9]
\W Ký tự không phải chữ. Viết gọn cho [^\w]
\S+ Một số ký tự không phải khoảng trắng(một hoặc nhiều)
\b Ký tự thuộc a-z hoặc A-Z hoặc 0-9 hoặc _ . Viết gọn cho [a-zA-Z_0-9]
* Xuất hiện 0 hoặc nhiều lần. Viết gọn cho {0,}
+ Xuất hiện 1 hoặc nhiều lần. Viết gọn cho {1,}
? Xuất hiện 0 hoặc 1 lần. Viết gọn cho {0,1}
{X} Xuất hiện X lần
{X , Y} Xuất hiện trong khoảng X đến Y lần
*? Tìm kiếm việc khớp nhỏ nhất