Nội dung chính
Cách viết một mẫu biểu thức chính quy
Xem chi tiết tại
- https://developer.mozilla.org/vi/docs/Web/JavaScript/Guide/Regular_Expressions
- http://vforum.vn/diendan/showthread.php?6071-Xu-ly-chuoi-bang-Javascript-Regular-Expression
Một mẫu biểu thức chính quy là một tập các kí tự thường, như /abc/
, hay một tập kết hợp cả kí tự thường và kí tự đặc biệt như /ab*c/
hoặc /Chapter (\d+)\.\d*/
. Trong ví dụ cuối, ta thấy rằng nó chứa cả các dấu ngoặc đơn( () )được sử dụng như các thiết bị nhớ, tức là các mẫu trong phần () này sau khi được tìm kiếm có thể được nhớ lại để sử dụng cho các lần sau. Bạn có thể xem chi tiết hơn tại: Sử dụng dấu ngoặc đơn tìm xâu con.
Sử dụng mẫu đơn giản
Các mẫu đơn giản là các mẫu có thể được xây dựng từ các kí tự có thể thể tìm kiếm một cách trực tiếp. Ví dụ, mẫu /abc/
sẽ tìm các các đoạn ‘abc’ theo đúng thứ tự đó trong các chuỗi. Mẫu này sẽ khớp được với “Hi, do you know your abc’s?” và “The latest airplane designs evolved from slabcraft.”, vì cả 2 chuỗi này đều chứa đoạn ‘abc’. Còn với chuỗi ‘Grab crab’, nó sẽ không khớp vì chuỗi này không chứa ‘abc’ theo đúng thứ tự, mà chỉ chứa ‘ab c’.
Sử dụng các kí tự đặc biệt
Các mẫu có thể chứa các kí tự đặc biệt cho các mục đích tìm kiếm nâng cao mà tìm kiếm trực tiếp sẽ khó khăn như tìm một đoạn chứa một hoặc nhiều hơn một kí tự b, hay tìm một hoặc nhiều kí tự dấu cách (while space). Ví dụ, mẫu /ab*c/
có thể tìm các đoạn có chứa: một kí tự ‘a’, theo sau là không có hoặc có một hoặc có nhiều kí tự ‘b’, cuối cùng là một kí tự ‘c’ như chuỗi “cbbabbbbcdebc,” sẽ được khớp với xâu con ‘abbbbc’.
Bảng dưới đây mô tả đầy đủ các kí tự đặc biệt có thể dùng với biểu thức chính quy.
Kí tự (kí hiệu, cờ) | Ý nghĩa |
---|---|
\ |
Tìm với luật dưới đây:
Một dấu gạch chéo ngược sẽ biến một kí tự thường liền kế phía sau thành một kí tự đặc biệt, tức là nó không được sử dụng để tìm kiếm thông thường nữa. Ví dụ, trường hợp kí tự ‘ Tuy nhiên nếu đứng trước một kí tự đặc biệt thì nó sẽ biến kí tự này thành một kí tự thường, tức là bạn có thể tìm kiếm kí tự đặc biệt này trong xâu chuỗi của bạn như các kí tự thường khác. Ví dụ, mẫu Đừng quên \ cũng là một kí tự đặc biệt, khi cần so khớp chính nó ta cũng phải đánh dấu nó là kí tự đặc biệt bằng cách đặt \ ở trước (\\). |
^ |
Khớp các kí tự đứng đầu một chuỗi. Nếu có nhiều cờ này thì nó còn khớp được cả các kí tự đứng đầu của mỗi dòng (sau kí tự xuống dòng).
Ví dụ, Ý nghĩa của ‘^’ sẽ thay đổi khi nó xuất hiện như một kí tự đầu tiên trong một lớp kí tự, xem phần complemented character sets để biết thêm chi tiết. |
$ |
So khớp ở cuối chuỗi. Nếu gắn cờ multiline (đa dòng), nó sẽ khớp ngay trước kí tự xuống dòng.
Ví dụ, /t$/ không khớp với ‘t’ trong chuỗi “eater” nhưng lại khớp trong chuỗi “eat”. |
* |
Cho phép kí tự trước nó lặp lại 0 lần hoặc nhiều lần. Tương đương với cách viết {0,}.
Ví dụ, /bo*/ khớp với ‘boooo’ trong chuỗi “A ghost booooed” nhưng không khớp trong chuỗi “A birth warbled”. |
+ |
Cho phép kí tự trước nó lặp lại 1 lần hoặc nhiều lần. Tương đương với cách viết {1,}.
Ví dụ, /a+/ khớp với ‘a’ trong chuỗi “candy” và khớp với tất cả kí tự a liền nhau trong chuỗi “caaaaaaandy”. |
? |
Cho phép kí tự trước nó lặp lại 0 lần hoặc 1 lần duy nhất. Tương đương với cách viết {0,1}.
Ví dụ, /e?le?/ khớp với ‘el’ trong chuỗi “angel” và ‘le’ trong chuỗi “angle” hay ‘l’ trong “oslo”. Nếu sử dụng kí tự này ngay sau bất kì kí tự định lượng nào trong số *,+,? hay {}, đều làm bộ định lượng “chán ăn” (dừng so khớp sau ngay khi tìm được kí tự phù hợp), trái ngược với đức tính “tham lam” vốn sẵn của chúng (khớp tất cả kí tự chúng tìm thấy). Ví dụ, áp dụng biểu mẫu /\d+/ cho “123abc” ta được “123”. Nhưng áp /\d+?/ cho chính chuỗi trên ta chỉ nhận được kết quả là “1”. Bạn có thể đọc thêm trong mục x(?=y) và x(?!y) của bảng này. |
. |
Dấu . khớp với bất kì kí tự đơn nào ngoại trừ kí tự xuống dòng.
Ví dụ, /.n/ khớp với ‘an’ và ‘on’ trong chuỗi “no, an apple is on the tree”, nhưng không khớp với ‘no’. |
(x) |
Khớp ‘x’ và nhớ kết quả so khớp này, như ví dụ ở dưới. Các dấu ngoặc tròn được gọi là các dấu ngoặc có nhớ.
Biểu mẫu Chú ý rằng Cú pháp |
(?:x) |
Khớp ‘x’ nhưng không nhớ kết quả so khớp. Những dấu ngoặc tròn được gọi là những dấu ngoặc không nhớ, nó cho phép bạn định nghĩa những biểu thức con cho những toán tử so khớp. Xem xét biểu thức đơn giản /(?:foo){1,2}/. Nếu biểu thức này được viết là /foo{1,2}/ , {1,2} sẽ chỉ áp dụng cho kí tự ‘o’ ở cuối chuỗi ‘foo’. Với những dấu ngoặc không nhớ, {1,2} sẽ áp dụng cho cả cụm ‘foo’. |
x(?=y) |
Chỉ khớp ‘x’ nếu ‘x’ theo sau bởi ‘y’.
Ví dụ, |
x(?!y) |
Chỉ khớp ‘x’ nếu ‘x’ không được theo sau bởi ‘y’.
Ví dụ: |
x|y |
Khớp ‘x’ hoặc ‘y’
Ví dụ, |
{n} |
Kí tự đứng trước phải xuất hiện n lần. n phải là một số nguyên dương.
Ví dụ, |
{n,m} |
Kí tự đứng trước phải xuất hiện từ n đến m lần. n và m là số nguyên dương và n <= m. Nếu m bị bỏ qua, nó tương đương như ∞.
Ví dụ, |
[xyz] |
Lớp kí tự. Loại mẫu này dùng để so khớp với một kí tự bất kì trong dấu ngoặc vuông, bao gồm cả escape sequences. Trong lớp kí tự, dấu chấm (.) và dấu hoa thị (*) không còn là kí tự đặc biệt nên ta không cần kí tự thoát đứng trước nó. Bạn có thể chỉ định một khoảng kí tự bằng cách sử dụng một kí tự gạch nối (-) như trong ví dụ dưới đây:
Mẫu |
[^xyz] |
Lớp kí tự phủ định. Khi kí tự ^ đứng đầu tiên trong dấu ngoặc vuông, nó phủ định mẫu này.
Ví dụ, |
[\b] |
Khớp với kí tự dịch lùi – backspace (U+0008). Bạn phải đặt trong dấu ngoặc vuông nếu muốn so khớp một kí tự dịch lùi. (Đừng nhầm lẫn với mẫu \b). |
\b |
Khớp với kí tự biên. Kí tự biên là một kí tự giả, nó khớp với vị trí mà một kí tự không được theo sau hoặc đứng trước bởi một kí tự khác. Tương đương với mẫu (^\w|\w$|\W\w|\w\W). Lưu ý rằng một kí tự biên được khớp sẽ không bao gồm trong kết quả so khớp. Nói cách khác, độ dài của một kí tự biên là 0. (Đừng nhầm lẫn với mẫu [\b])
Ví dụ: Chú ý: Engine biên dịch biểu thức chính quy trong Javascript định nghĩa một lớp kí tự là những kí tự thường. Bất kỳ kí tự nào không thuộc lớp kí tự bị xem như một kí tự ngắt. Lớp kí tự này khá hạn chế: nó bao gồm bộ kí tự La-tinh cả hoa và thường, số thập phân và kí tự gạch dưới. Kí tự có dấu, như “é” hay “ü”, không may, bị đối xử như một kí tự ngắt. |
\B |
Khớp với kí tự không phải kí tự biên. Mẫu này khớp tại vị trí mà kí tự trước và kí tự sau nó cùng kiểu: hoặc cả hai là kí tự hoặc cả hai không phải là kí tự. Bắt đầu và kết thúc chuỗi không được xem là những kí tự.
Ví dụ, |
\cX |
X là một kí tự trong khoảng A tới Z. Mẫu này khớp với một kí tự điều khiển trong một chuỗi.
Ví dụ: |
\d |
Khớp với một kí tự số. Tương đương với mẫu [0-9].
Ví dụ: |
\D |
Khớp với một kí tự không phải là kí tự số. Tương đương với mẫu [^0-9].
Ví dụ; |
\f |
Khớp với kí tự phân trang – form feed (U+000C). |
\n |
Khớp với kí tự xuống dòng – line feed (U+000A). |
\r |
Khớp với kí tự quay đầu dòng – carriage return (U+000D). |
\s |
Khớp với một kí tự khoảng trắng, bao gồm trống – space, tab, phân trang – form feed, phân dòng – line feed. Tương đương với [ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000] .
Ví dụ: |
\S |
Khớp với một kí tự không phải khoảng trắng. Tương đương với [^ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000] .
Ví dụ: |
\t |
Khớp với kí tự tab (U+0009). |
\v |
Khớp với kí tự vertical tab (U+000B). |
\w |
Khớp với tất cả kí tự là chữ, số và gạch dưới. Tương đương với mẫu [A-Za-z0-9_] .
ví dụ, |
\W |
Khớp với tất cả kí tự không phải là chữ. Tương đương với mẫu [^A-Za-z0-9_] .
ví dụ, |
\n |
Trong đó, n là một số nguyên dương, một tham chiếu ngược tới chuỗi khớp thứ n trong biểu thức (đếm từ trái sang, bắt đầu bằng 1).
ví dụ, |
\0 |
Khớp với kí tự NULL (U+0000). Lưu ý: không được thêm bất kì một kí tự số nào sau 0, vì \0<các-kí-tự-số> là một biểu diễn hệ bát phân escape sequence. |
\xhh |
Khớp với kí tự với mã code là hh (2 số trong hệ thập lục phân) |
\uhhhh |
Khớp với kí tự có mã hhhh (4 số trong hệ thập lục phân). |
Mã hóa escapse chuỗi người dùng nhập vào bằng một hàm thay thế đơn giản sử dụng biểu thức chính quy:
function escapeRegExp(string){
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
Sử dụng ngoặc tròn
Ngoặc tròn bao quanh bất kỳ phần nào của biểu thức chính quy sẽ khiến phần kết quả so khớp được nhớ. Mỗi lần nhớ, chuỗi con có thể được gọi lại để sử dụng, mô tả trong Using Parenthesized Substring Matches.
Ví dụ, mẫu /Chapter (\d+)\.\d*/
khớp đúng với ‘Chapter ‘ theo sau bởi một hoặc nhiều kí tự số, sau nữa là một dấu chấm thập phân, cuối cùng có thể là 0 hoặc nhiều kí tự số. Bên cạnh đó, dấu ngoặc tròn được sử dụng để nhớ một hoặc nhiều kí tự số đầu tiên được khớp.
Mẫu này được tìm thấy trong chuỗi “Open Chapter 4.3, paragraph 6”, nhớ ‘4’ nhưng không được tìm thấy trong chuỗi “Chapter 3 and 4”, bởi vì chuỗi đó không có dấu chấm sau kí tự số ‘3’.
Để so khớp một chuỗi con không nhớ, đặt ?: ở vị trí đầu tiên trong ngoặc. Ví dụ, (?:\d+)
khớp với một hoặc nhiều kí tự số nhưng không nhớ kết quả so khớp.