Giới thiệu

Regular expression (tạm dịch: biểu thức thường quy) là một chuỗi kí tự đặc biệt được dùng như mẫu (pattern) để so khớp (matching) với các chuỗi. Xuất hiện vào những năm 1940 như là một cách để mô tả các ngôn ngữ thường quy (regular languages) và chỉ phổ biến trong thế giới lập trình vào những năm 1970. Ngày nay, Regular Expression là kiến thức cốt lõi cần trang bị cho những ai học hay làm việc trong lĩnh vực lập trình.

Regular expression có thể rất đơn giản như:

\d

Hay phức tạp hơn như:


^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$

 Công cụ trực tuyến Regexpal

Công cụ dùng để thực hành regular expression nhanh nhất, dễ nhất là Regex Pal bằng cách truy cập website www.regexpal.com, giao diện trông như sau:

Chúng ta có thể nhập một regular expression vào ô phía trên và một chuỗi dùng để kiểm tra hay so khớp vào ô bên dưới (Test String).

Để dễ hiểu hơn, chúng ta xét ví dụ dùng một số điện thoại di động để so khớp với một regular expression. Gõ số di động vào vùng Test String:


093-574-4659

Để đơn giản khi bắt đầu, chúng ta gõ lại số điện thoại trên vào vùng Regular Expression:


093-574-4659

Kết quả:

Chúng ta thấy rằng toàn bộ các kí tự trong chuỗi số điện thoại vùng Test String được bôi màu xanh, điều đó có nghĩa là toàn bộ các kí tự trong số điện thoại đều khớp với chuỗi regular expression. Chuỗi regular expression dùng như trên gọi là một string literal (có thể hiểu nôm na là một chuỗi tầm thường).

Bây giờ chúng ta xoá toàn bộ chuỗi regular expression và chỉ giữ lại một số 9, kết quả tại vùng Test String là tất cả các số 9 được bôi xanh:

Dùng Character Class (tạm dịch là lớp kí tự)

Nếu muốn so khớp với tất cả các kí tự một lần hay với bất kỳ kí tự nào, chúng ta có thể dùng lớp kí tự (character class) hay thỉnh thoảng cũng được gọi là tập kí tự (character set). Ví dụ chúng ta muốn so khớp với kí số bất kỳ (digit) trong phạm vi từ 0 đến 9, có thể dùng lớp kí tự sau:


[0-9]

Dấu ngoặc vuông không dùng để so khớp, nó là một metacharacter (tạm dịch là siêu kí tự) hay là một kí tự có ý nghĩa đặc biệt trong regular expression. Kết quả khi gõ lớp kí tự trên vào vùng Regular Expression của Regex Pal là các kí số trong chuỗi số điện thoại được bôi xanh như sau:

Chúng ta có thể hạn chế phạm vi các kí số trong character class bằng một danh sách các kí số cụ thể dùng để so khớp như sau


[0345679]

Kết quả:

Chúng ta có thể dùng một regular expression để so khớp với chuỗi số điện thoại di động (bao gồm cả dấu gạch nối) dùng character class như sau:


[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]

Kết quả:

Tuy nhiên, dùng charater class sẽ khiến cho chuỗi regular expression rất dài. Có một giải pháp khác là dùng character shorthand.

Charater Shorthand (kí tự tắt)

Thay vì dùng character class như [0-9], chúng ta có thể dùng cách biểu diễn gọn hơn bằng character shorthand \d. \d dùng để so khớp với bất kì ký số (A rập) nào. Regular expression dùng để so khớp với số di động có thể viết lại như sau:


\d\d\d-\d\d\d-\d\d\d\d

Kết quả:

Chuỗi regular expression có chứa dấu gạch nối và so khớp với số điện thoại chứa dấu gạch nối, nhưng nếu số điện thoại không dùng dấu gạch nối mà dùng một kí tự khác bất kỳ thì sao? Một giải pháp tổng quát hơn là dùng \D (lưu ý chữ D hoa) là character shorthand đại diện cho mọi kí tự, trừ các kí số. Regular expression có thể viết lại:


\d\d\d\D\d\d\d\D\d\d\d\d

Kết quả

Bên cạnh dùng \D, chúng ta cũng có thể dùng dấu chấm (.) làm kí tự đại diện (wildcard) cho bất kì kí tự nào (kể cả kí số) như sau:


\d\d\d.\d\d\d.\d\d\d\d

Kết quả dùng regular expression trên và số di động thay dấu gạch bằng %:

Trên đây chỉ là ví dụ đơn giản về Regular Expression và cách dùng công cụ trực tuyến Regex Pal. Trong các chương kế tiếp chúng ta sẽ tìm hiểu sâu hơn về Regular Expression đồng thời cũng tìm hiểu một công cụ trực tuyến hữu ích khác.