Biểu thức quy tắc trong javaScript (regular expression)

  • JavaScript
  • 30 tháng 10 2012
  • bởi Văn Khương
  • 0 Comments

Cũng như những ngôn ngữ lập trình khác biểu thức quy tắc (regular expression/ RegExp) là một tính năng đắc lực để kiểm tra, so sánh, thay thế, tách, ghép một chuỗi nào đó theo một quy tắc bạn quy định, nếu bạn đã tìm hiểu về biểu thức quy tắc trong ngôn ngữ PHP rồi thì sẽ thấy javaScript cũng có cách quy định tương tự chỉ khác ở một số hàm xử lý biểu thức quy tắc. Có 2 phương thức của RegExp để kiểm tra là exec và test, có một vài phương thức của chuỗi hữu dụng với biểu thức quy tắc là search, match, split, replace.

Trong javaScript ta có 2 cách để khai báo biểu thức quy tắc:

  1. Khai báo với 2 dấu "/" ở đầu và cuối biểu thức
  2. Khai báo thông qua việc tạo đối tượng RegExp

Cách thứ nhất thường dùng nhiều hơn bởi sự đơn giản trong khai báo.

Khi xử lý một chuỗi với biểu thức điều kiện một điều quan trọng là bạn muốn khi áp dụng ký tự có phân biệt chữ in hoa in thường hay không và áp dụng cho đoạn chuỗi đầu tiên tìm được hay tất cả các đoạn chuỗi hợp quy tắc, ta sẽ được tìm hiểu điều này sau đây:

  •  "/quy tắc/" biểu thức có phân biệt chữ in hoa, in thường, và chỉ áp dụng cho đoạn chuỗi đầu tiên tìm thấy đúng quy tắc
  • "/quy tắc/g" biểu thức có phân biệt hoa - thường và áp dụng cho tất cả đoạn chuỗi hợp quy tắc
  • "/quy tắc/i" biểu thức không phân biệt hoa - thường, và chỉ áp dụng cho đoạn chuỗi đầu tiên tìm thấy đúng quy tắc
  •  "/quy tắc/gi" biểu thức không phân biệt hoa - thường, và áp dụng cho tất cả đoạn chuỗi hợp quy tắc

Ví dụ: thay ký tự n bằng dấu "*"

var str = 'Xin chào!, tôi là VANKHUONG 777';
var str1 = str.replace(/n/gi, '*');
document.write(str1);
// Xi* chào!, tôi là VA*KHUO*G 777
var str2 = str.replace(/n/,'*');
document.write(str2);
// Xi* chào!, tôi là VANKHUONG 777

Tiếp theo ta sẽ tìm hiểu cách viết biểu thức quy tắc với cách dùng ký tự đại diện được quy ước trong biểu thức.

Quy tắc về vị trí

  • "^" nghĩa là bắt đầu một chuỗi
  • "$" nghĩa là kết thúc một chuỗi
  • "\b" nghĩa là điểm giữa một ký tự là từ và ký tự không phải là từ, ký tự là từ ở đây là ký tự từ A-z, 0-9
  • "\B" ngược lại với '/b'

Ví du:

var str = 'ngo van khuong';
var str3 = str.replace(/n\b/, '*');
// str3: ngo va* khuong
var str4 = str.replace(/n\B/, '*');
// str4: *go van khuo*g

Quy tắc về những ký tự metasymbol

  • "." đại diện bất kỳ ký tự nào
  • "\d" đại diện cho một ký tự số từ 0-9, tương đương với cách viết [0-9]
  • "\D" đại diện cho một ký tự không phải là kiểu số từ 0-9, ngược lại với "\d"
  • "\s" đại diện cho một ký tự là khoảng trắng
  • "\S" đại diện cho một ký tự không phải là khoảng trắng, ngược lại với "\s"
  • "\w" đại diện cho một ký tự từ A-Z hoặc a-z hoặc 0-9, hoặc ký tự gạch dưới "_"
  • "\W" đại diện cho một ký tự không phải là từ A-Z, a-z, 0-9, ký tự gạch dưới "_"

Ví dụ:

var str = 'Xin chào!, tôi là VANKHUONG 777';
var str5 = str.replace(/\w/g, '*');
// str5: *** **à*!, *ô* *à ********* ***

Quy tắc về số lượng ký tự

  • "x?" nghĩa là một ký tự "x" hoặc không có ký tự nào
  • "x*" nghĩa là một hoặc nhiều ký tự "x" hoặc không có ký tự nào
  • "x+" nghĩa là có ít nhất một ký tự x
  • "x{n}" nghĩa là ký tự x lặp lại n lần
  • "x{n,}" nghĩa là ký tự x lặp lại ít nhất n lần
  • "x{n,m}" nghĩa là ký tự x lặp lại từ n tới m lần

Ví dụ:

var str = 'good night, godgad, gd, gooogle';
var str6 = str.replace(/go?d/gi, '*');
// str6: good night, *gad, *, gooogle
var str7 = str.replace(/g(oo)?d/gi, '*');
// str7: * night, godgad, *, gooogle
var str8 = str.replace(/go*d/gi, '*');
// str8: * night, *gad, *, gooogle
var str9 = str.replace(/go+/gi, '*');
// str9: *d night, *dgad, gd, *gle
var str10 = str.replace(/o{2}/gi, '*');
// str10: g*d night, godgad, gd, gooogle
var str11 = str.replace(/o{2,}/gi, '*');
// str11: g*d night, godgad, gd, g*gle
var str12 = str.replace(/go{1,3}d/gi, '*');
// str12: *d night, *dgad, gd, gooogle

Quy tắc về danh sách ký tự

  • "[...]" trong dấu ngoặc vuông liệt kê danh sách những ký tự hợp quy tắc, có thể dùng dấu gạch giữa "-"giữa 2 ký tự để thể hiện danh sách những ký tự trong khoảng 2 ký tự theo vị trí ASCII của ký tự
  • "[^...]" chức năng thì ngược lại với "[...]" thay vì liệt kê những ký tự hợp quy tắc, nó cho biết bất kỳ ký tự nào ngoài danh sách các ký tự trong dấu ngoặc vuông

Ví dụ:

var str ='ABCDEF, abcdef, 12345';
var str13 = str.replace(/[Ab1]/g, '*');
// str13: *BCDEF, a*cdef, *2345
var str14 = str.replace(/[A-Cd-f1-35]/g, '*');
// str14: ***DEF, abc***, ***4*
var str15 = str.replace(/[^A-f4-5]/g, '*');
// str15: ABCDEF**abcdef*****45

Với biểu thức quy tắc bạn có thể có nhiều cách viết khác nhau cùng theo một quy tắc hay cùng cho bạn kết quả giống nhau, có người viết dài người viết ngắn nhưng miễn sao bạn thấy giễ hiểu là được, nếu bạn viết quen thì biểu thức nhìn sẽ ngắn hơn. Nếu bạn không hiểu rõ các quy ước trong biểu thức quy tắc thì bạn cũng chẳng hiểu người khác viết gì vì đa số những người có kinh nghiệm đều viết biểu thức ngắn và chặt chẽ, hy vọng bạn thấy bài viết này bổ ích và có thể vận dụng nó một cách hiệu quả.

  • Chia sẻ
comments powered by Disqus