Regex là gì?
Regular Expression (Regex) có nghĩa là “Biểu thức chính quy” dùng để môt tả một mẫu chuỗi được sắp xếp theo một quy luật nhất định nào đó, ví dụ số điện thoại, địa chỉ email…
Tác dụng của Regex
- Regex được sử dụng trong việc xử lý chuỗi như: tìm kiếm, thay thế, bóc tách dữ liệu…
- Regex được sử dụng nhiều trong việc kiểm tra tính hợp lệ đầu vào của dữ liệu, ví dụ: địa chỉ email có hợp lệ hay không? có đúng định dạng ngày tháng hay không? …
Khai báo Regex trong Javascript
var tên_biến = /mẫu_chuỗi/cách tìm;
Có 3 cách tìm như sau:
- g: Lặp lại quá trình tìm kiếm cho đến khi kết thúc chuỗi
- i: không phân biệt ký tự hoa – thường
- m: Hỗ trợ tìm kiếm nhiều dòng
Có thể kết hợp nhiều cách tìm với nhau, ví dụ: gi
Biểu thức Regex có thể có hoặc không có cách tìm
Một số phương thức phổ biến hỗ trợ Regex trong Javascript
- search(): Tìm kiếm chuỗi phù hợp với biểu thức và trả về vị trí của chuỗi đó
- match(): Tìm kiếm chuỗi phù hợp với biểu thức và trả về mảng giá trị tìm thấy
- replace(): Tìm kiếm chuỗi phù hợp với biểu thức và thay thế bằng một chuỗi khác
- test(): Kiểm tra chuỗi có phù hợp với biểu thức hay không và trả về kết quả dạng logic (true và false)
Ví dụ: Tìm và in ra tất cả các kí tự a có trong chuỗi str không phân biệt ký tự hoa – thường
var pattern = /a/gi; str = "Chuoi co chua 2 ky tu A"; document.write(str.match(pattern)); //Kết quả: a,A
Các phép toán tìm kiếm theo vị trị
Giả sử ta có chuỗi str
- ^: Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở đầu của chuỗi str
- $: Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở cuối của chuỗi str
- \b: Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở đầu hoặc cuối của một từ trong chuỗi str . (tuỳ thuộc vào vị trí đặt \b ở đầu hoặc cuối của chuỗi trong biểu thức Regex).
- \B: Trả về chuỗi kết quả trong trường hợp chuỗi này không nằm ở vị trí đầu hoặc cuối của một từ trong chuỗi str. (tuỳ thuộc vào vị trí đặt \B ở đầu hoặc cuối của chuỗi trong biểu thức Regex)
- ?=: Trả về chuỗi kết quả nếu theo sau chuỗi đó là một chuỗi nào đó được chỉ định trước
- ?!: Trả về chuỗi kết quả nếu sau chuỗi đó không phải là một chuỗi nào đó được chỉ định trước
Các lớp ký tự trong Regex
- [xyz]: Tìm một ký tự bất kỳ nằm trong tập ký tự giữa cặp dấu ngoặc vuông
- [a-z]: Tìm một ký tự bất kỳ nằm trong tập ký tự từ a đến z
- [^xyz]: Tìm một ký tự bất kỳ không thuộc tập ký tự giữa cặp dấu ngoặc vuông.
- . (chấm): Tìm bất kỳ một ký tự nào không phải là ký tự xuống dòng mới hoặc ký tự kết thúc dòng.
- \w: Tìm một ký tự dạng a-Z, 0-9 và dấu gạch dưới.
- \W: Ngược lại với \w
- \d: Tìm một ký tự thuộc tập ký tự từ 0 đến 9
- \D: Ngược lại với \d: Tìm một ký tự không nằm trong tập ký tự từ 0 đến 9
- \s: Tìm ký tự khoảng trắng (dấu cách)
- \S:Tìm một ký tự không phải là dấu cách
Ví dụ: Tìm tất cả các ký tự là số trong chuỗi cho trước
str = "So 1, so 2, so 3"; document.write(str.match(/[0-9]/g)); //Hoặc có thể sử dụng như sau: document.write(str.match(/d/g));
Phép lặp trong regex
RegEx cho phép tìm kiếm lặp bên trong biểu thức Regex:
- {x}: Lặp một ký tự hoặc một biểu thức con trước đó x lần
- {x,y}: Lặp một ký tự hoặc một biểu thức con trước đó từ x đến y lần
- {x,}: Lặp một ký tự hoặc một biểu thức con trước đó >= x lần
- ?: Lặp một ký tự hoặc một biểu thức con trước đó 0 hoặc 1 lần
- *: Lặp một ký tự hoặc một biểu thức con trước đó >=0 lần
- +: Lặp một ký tự hoặc một biểu thức con trước đó >=1 lần

{ 13 comments… read them below or add one }
Bài dễ hiểu lắm anh ạ. Em cảm ơn anh nhé
Cảm ơn anh,rất dễ hiểu
video quá hay cho một cuộc đời người lập trình :X:X:X thank anh iu
Thank bạn, ghé thăm EW thường xuyên nhé
bài học rất dễ hiểu.em có thể thiết kề bằng photoshop nhưng không đẹp lắm.HTML CSS Jquery thì cũng thành thạo rồi. Chưa biết là có thể đi làm được chưa?
Em có thể đi làm được rồi!… Những công việc như: chạy bàn sách vữa …
Thanks Peter Tran ! Và cho bạn nào không muốn cải Regulator : http://gskinner.com/RegExr/
cám ơn bạn bài viết này
Anh ơi, anh giải thích dùm e cách dùng phương thức replace() với đc ko ạ
E có 1 chuỗi đầu vào với một tập hợp các chuỗi con cần tìm ra và được thay thế bằng 1 tập các chuỗi con khác
các chuỗi con cần tìm có chứa các ký tự đặc biệt như ngoặc vuông, ngoặc tròn, dấu sao, dấu bằng dấu ! ~ ` > < dấu bằng =
mỗi chuỗi con sẽ được thay thế tương ứng với chuỗi thay thế duy nhất của nó, đi liền thành 1 cặp. Các chuỗi này hoàn toàn xác định, đã cho trước.
Ví dụ: e muốn cứ chỗ nào có xuất hiện chuỗi :vn: thì sẽ được thay bằng chuỗi "Việt Nam"
tức là vn thì sẽ bỏ qua (có tính cả dấu hai chấm ) và :vn::vn: sẽ thành "Việt NamViệt Nam"
Vấn đề là các cặp đôi thay thế này hơi nhiều, ví dụ e có 1 danh sách hơn 200 quốc gia cần thay thế với phương thức trên.
Có cách nào để mình nhập các chuỗi cần tìm theo 1 danh sách, và các chuỗi thay thế theo 1 danh sách, và index 1 của danh sách này sẽ đc thay với index 1 của danh sách kia, index 2 của danh sách này sẽ đc thay với index 2 của danh sách kia…cứ như vậy cho đến hết.
Hoặc có cách nào khác mà mã bớt cồng kềnh và rối ko ạ ?
Hi vọng a có cách nào đó, e cảm ơn a trc
Em thấy những trình duyệt mới thì những ký tự đặc biệt có dấu chia “/” hay không thì nó cũng hiểu.
Cám ơn bạn rất hay
anh dùng add-ons gì để viết code đấy ạ
Đó không phải là Add on bạn ah, mình sử dụng thư viện Code Mirror để xây dựng một chương trình editor đơn giản, bạn có thể tìm hiểu thêm về Code Mirror tại: http://codemirror.net/