Home > Web > Regular Expression trong JavaScript

Regular Expression trong JavaScript

Regex là gì ?

Regex (Regular Expression) có nghĩa là “Biểu thức chính quy” dùng để mô tả một mẫu chuỗi (string pattern) được sắp xếp theo một quy luật nhất định nào đó, ví dụ số điện thoại, ngày tháng, địa chỉ email…

Khi bạn tìm 1 đoạn text, bạn có thể sử dụng một mẫu chuỗi để mô tả cái cần tìm.

Một mẫu đơn giản có thể là một ký tự đơn.

Mẫu phức tạp hơn có thể bao gồm nhiều ký tự, và có thể sử dụng để phân tích ngữ pháp, kiểm tra định dạng, thay thế và nhiều việc khác nữa.

Khái niệm về biểu thức

Một biểu thức bao gồm các toán tử và các toán hạng:

  • Toán tử : các phép toán ( Ví dụ : cộng, trừ, nhân, chia, lặp, gộp, so sánh …)
  • Toán hạng: Biến, giá trị dùng để tính toán.

Tác dụng của Regex

Trong các kỹ thuật xử lý chuỗi (Ví dụ : Tìm kiếm, thay thế … ), thông thường chúng ta phải xác định các chuỗi tường minh để tìm kiếm. Các chuỗi này được gọi là từ khóa.

Tuy nhiên không phải lúc nào chúng ta cũng có thể chỉ rõ chuỗi từ khóa đó mà chỉ có thể mô tả được quy luật để sinh ra chuỗi từ khóa đó, chẳng hạn làm thế nào để lấy được toàn bộ địa chỉ email trong một văn bản?

Regex giúp ta dễ dàng giải quyết vấn đề này. Đơn giản bạn chỉ cần thiết lập ra quy luật của một địa chỉ email và yêu cầu chương trình tìm kiếm theo luật đó.

Tóm lại, Regex có các tác dụng sau :

  • Regex được sử dụng trong việc xử lý chuỗi : 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? Định dạng ngày tháng có đúng không?

Cú pháp khai báo Regex trong Javascript

var patt = new RegExp(pattern, modifiers);

hoặc đơn giản là :

var patt = /pattern/modifiers;

Trong đó :

  • pattern : mẫu chuỗi
  • modifiers : cách tìm. Có 3 cách tìm như sau :
    • i: thực hiện tìm không phân biệt ký tự hoa – thường ( case-insensitive matching )
    • g : lặp lại quá trình tìm kiếm cho đến khi kết thúc chuỗi (global matching). Ví dụ khi thực hiện phương thức replace(), giá trị này sẽ thay thế tất cả các cụm từ tìm thấy thay vì chỉ cụm từ đầu tiên.
    • m : hỗ trợ tìm kiếm nhiều dòng ( multiline matching )

Có thể kết hợp nhiều cách tìm với nhau, ví dụ : gi

Regex có thể có hoặc không có cách tìm.

Ví dụ 1: Tìm chuỗi “w3schools” trong chuỗi gốc mà không phân biệt chữ hoa, chữ thường

var str = "Visit W3Schools";
var patt1 = /w3schools/i;
document.write(str.match(patt1)); // Kết quả : W3Schools

Ví dụ 2: Tìm tất cả các chuỗi “is” trong chuỗi gốc, có phân biệt chữ hoa chữ thường

var str="Is this all there is?";
var patt1=/is/g;
document.write(str.match(patt1)); 
// Kết quả : is, is ( Lưu ý chuỗi “Is” không hợp lệ )

Ví dụ 3: Tìm tất cả các chuỗi “is” trong chuỗi gốc, không phân biệt chữ hoa chữ thường

var str="Is this all there is?";
var patt1=/is/gi;
document.write(str.match(patt1)); // Kết quả : Is,is, is

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/false)
  • exec(): Tìm kiếm một chuỗi với một giá trị chỉ định và trả về text của giá trị tìm được. Nếu không tìm được giá trị phù hợp, nó sẽ trả về null.

Ví dụ test(): Kiểm tra trong chuỗi có ký tự “e” hay không ? Trả về true nếu có, false nếu không

var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free")); 
// Kết quả : true

Ví dụ exec(): Kiểm tra trong chuỗi có ký tự “e” hay không? Trả về “e” nếu có, null nếu không

var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free")); 
// Kết quả : e

Các phép toán tìm kiếm theo vị trí

  • ^ : Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở đầu của chuỗi gốc
  • $ : Trả về chuỗi kết quả trong trường hợp chuỗi này nằm ở cuối của chuỗi gốc
  • \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 gốc. (Tùy thuộc vào vị trí đặt \b ở đầu hoặc cuối của chuỗi trong biểu thức Regex)
  • \B : Ngược lại với \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 gốc. (Tùy 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
  • ?! : Ngược lại với ?= . 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

Giả sử ta có chuỗi gốc :

var s = “Hello everybody, welcome to my blog”;

Ví dụ ^ :

document.write(s.match(/^Hello/i)); 
// Kết quả : Hello, vì chữ “Hello” nằm ở đầu chuỗi s.

Ví dụ $ : 

document.write(s.match(/z$/gi)); 
//Kết quả : null, vì không tìm thấy chữ “z” nằm ở cuối chuỗi s.
document.write(s.match(/Blog$/gi)); 
//Kết quả : blog, vì chữ “Blog” nằm ở vị trí cuối chuỗi s và thỏa mãn 
điều kiện tìm kiếm /gi ( tìm toàn bộ và không phân biệt chữ hoa chữ thường).

Ví dụ \b : 

document.write(s.match(/\bev/gi)); 
//Kết quả: ev vì chữ ev nằm ở vị trí đầu của từ everybody trong chuỗi s.
document.write(s.match(/y\b/gi)); 
//Kết quả: y,y vì chữ y nằm ở vị trí cuối của 2 từ everybody và my trong chuỗi s

Ví dụ \B : 

document.write(s.match(/\Bo/gi)); 
// Kết quả: o,o,o,o,o vì có 5 chữ o không nằm ở vị trí đầu của từ trong chuỗi s.
document.write(s.match(/o\B/gi)); 
// Kết quả o,o,o vì có 3 chữ o ( trong từ everybody, welcome, blog ) không nằm 
ở vị trí cuối của từ trong chuỗi s. 
( 2 chữ o trong từ Hello, to nằm ở cuối của từ nên không phù hợp ).

Ví dụ ?= :

document.write(s.match(/l(?=o)/gi)); 
// Kết quả l,l vì trong từ Hello và blog có chữ l theo sau là chữ o

Ví dụ ?! :

document.write(s.match(/l(?!o)/gi)); 
// Kết quả l,l vì trong từ Hello và welcome có chữ l mà theo sau không phải chữ o 
( ở từ Hello có chữ “ll”, ở từ welcome có chữ “lc”)

Brackets (dấu ngoặc) trong Regex

  • [abc] : Tìm tất cả các ký tự nằm trong tập ký tự giữa cặp dấu ngoặc vuông
  • [^abc]: Tìm tất cả các ký tự không nằm trong tập ký tự giữa cặp dấu ngoặc vuông
  • [0-9]: Tìm tất cả các chữ số từ 0 đến 9
  • [A-Z]: Tìm tất cả các ký tự nằm trong khoảng từ A hoa đến Z hoa
  • [a-z]: Tìm tất cả các ký tự nằm trong khoảng từ a thường đến z thường
  • [A-z]: Tìm tất cả các ký tự nằm trong khoảng từ A hoa đến z thường
  • (red|blue|green): Tìm tất cả các ký tự là một trong các giá trị red, blue, green

Ví dụ [abc]:

document.write(s.match(/[le]/gi)); // Kết quả : e,l,l,e,e,e,l,e,l

Ví dụ [^abc]:

document.write(s.match(/[^le ,]/gi));
// Tìm tất cả các ký tự không phải là “l”,”e”,dấu cách “ “ , dấu phẩy “,”. 
// Kết quả : H,o,v,r,y,b,o,d,y,w,c,o,m,t,o,m,y,b,o,g

Ví dụ [0-9]:

Giả sử có chuỗi

var sDigit = “Ngày 02/09 là Quốc khánh nước CHXHCN Việt Nam”;

Khi đó :

document.write(sDigit.match(/[0-9]/g));// Kết quả : 0,2,0,9
document.write(sDigit.match(/[0-6]/g));// Kết quả : 0,2,0

Metacharacters (Siêu ký tự) trong Regex

  • . : Tìm một ký tự đơn ( bao gồm cả khoảng trắng, dấu phẩy, …) , ngoại trừ ký tự xuống dòng hoặc kết thúc dòng
  • \w : Tìm một ký tự word (không bao gồm khoảng trắng, dấu phẩy, …)
  • \W: Ngược lại với \w. Tìm một ký tự không phải word
  • \d: Tìm một ký tự là chữ số
  • \D: Tìm một ký tự không phải là chữ số
  • \s: Tìm một ký tự là khoảng trắng
  • \S: Tìm một ký tự không là khoảng trắng
  • : Tìm một ký tự NULL
  • \n : Tìm một ký tự xuống dòng
  • \f : Find a form feed character
  • \r : Find a carriage return character
  • \t : Tìm một ký tự tab
  • \v : Find a vertical tab character
  • \xxx : Tìm một ký tự Latin được chỉ định bởi 1 số xxx dạng bát phân (octal)
  • \xdd : Tìm một ký tự được chỉ định bởi 1 số xdd dạng hexa
  • \uxxxx : Tìm một ký tự Unicode được chỉ định bởi 1 số xxxx dạng hexa

Ví dụ . : 

document.write(s.match(/./g); 
// Kết quả : H,e,l,l,o, ,e,v,e,r,y,b,o,d,y,,, ,w,e,l,c,o,m,e, ,t,o, ,m,y, ,b,l,o,g

Ví dụ \w :

document.write(s.match(/\w/g);
// Kết quả : H,e,l,l,o,e,v,e,r,y,b,o,d,y,w,e,l,c,o,m,e,t,o,m,y,b,l,o,g

Ví dụ \W :

document.write(s.match(/\W/g);
// Kết quả : ,,, , , ,

Ví dụ \xxx :

document.write(s.match(/\110/g)); // Kết quả : H

Ví dụ \xdd : 

document.write(s.match(/\x48/g)); // Kết quả : H

Bạn có thể thao khảo bảng ký tự giữa các hệ khác nhau tại : http://www.asciitable.com/

Ví dụ \uxxxx:

document.write(s.match(/\u0048/g)); // Kết quả : H

Bạn có thể tham khảo bảng ký tự Unicode tại : http://www.utf8-chartable.de/

Phép lặp trong Regex

  • + : Lặp một ký tự hoặc một biểu thức con trướ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 đó 0 hoặc 1 lần
  • {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

Gộp nhóm các biểu thức :

  • () : Tìm kiếm một nhóm các ký tự bên trong cặp dấu ngoặc và lưu vào chuỗi kết quả
  • (?: ) : Tìm kiếm chuỗi kết quả không chứa tập ký tự nằm trong cặp dấu ngoặc
  • | : Phép toán hoặc, được sử dụng để kết hợp các mệnh đề với nhau vào chung một biểu thức.
Advertisements
Categories: Web
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: