Javascript – Biểu thức chính quy

Biểu thức chính quy RegExp (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/ 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 “*”

<script>
var str = 'Xin chào!, tôi là Nguyen Hữu PHP 777';
var str1 = str.replace(/n/gi, '*');
document.write(str1);
var str2 = str.replace(/n/,'*');
document.write(str2);
</script>

Xem ví dụ

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’

<script>
var str = 'Nguyen Van Toan';
var str3 = str.replace(/n\b/, '*');
document.write(str3);
var str4 = str.replace(/n\B/, '*');
document.write(str4);
</script>

Xem ví dụ

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ụ:

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

Xem ví dụ

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ụ:

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

Xem ví dụ

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ụ:

<script>
var str ='ABCDEF, abcdef, 12345';
var str13 = str.replace(/[Ab1]/g, '*');
document.write(str13);
var str14 = str.replace(/[A-Cd-f1-35]/g, '*');
document.write(str14);
var str15 = str.replace(/[^A-f4-5]/g, '*');
document.write(str15);
</script>

Xem ví dụ

Các hàm trong đối tượng Regular Expression

Khi khai báo một chuổi Regular Expression (Đa số chúng ta dùng cách rút gọn) thì chúng ta đã tạo ra một đối tượng RegExp, với các hàm được định nghĩa như sau:
test() Hàm này sẽ kiểm tra tham số truyền vào có trùng với chuỗi “pattern” mà ta đã định nghĩa hay không. Hàm trả về giá trị true nếu chuỗi nhập vào có mẫu ta cần tìm và false nếu tìm không thấy.
exec() Hàm này trả về một mảng chứa các đoạn trùng khớp với “pattern” chúng ta định nghĩa và trả về null nếu không tìm thấy.
Chúng ta còn có thể sử dụng rút gọn mà không cần khai báo chuổi Regular Expression. 

Ví dụ: dùng hàm test

<html>
<body>
    <p id="demo"></p>
    <script>
        var str = "Hiep si it huong dan hoc lap trinh web";
        var reg = /Hiep/; // kiem tra xem trong str có chữ Hiep?
        var result = reg.test(str);
        document.getElementById("demo").innerHTML = result;
    </script>
</body>
</html>

Xem ví dụ

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 dễ 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ả.