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

Cũng như những ngôn ngữ lập trình khác biểu thức quy tắc (regular expression) 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.

Trong javaScript ta có 2 cách để khai báo biểu thức quy tắc:
  • Khai báo với 2 dấu "/" ở đầu và cuối biểu thức
  • 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
  • "\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ả.

Không có nhận xét nào:

Đăng nhận xét