Regular expression syntax cheat sheet

Trang này cung cấp bảng tóm tắt tổng quát về tất cả các tính năng của cú pháp RegExp bằng cách tổng hợp nội dung từ các bài viết trong hướng dẫn RegExp. Nếu bạn cần thêm thông tin về một chủ đề cụ thể, hãy theo dõi liên kết trên tiêu đề tương ứng để truy cập bài viết đầy đủ hoặc truy cập hướng dẫn.

Lớp ký tự

Lớp ký tự phân biệt các loại ký tự khác nhau, ví dụ như phân biệt chữ cái và chữ số.

Ký tự Ý nghĩa
[xyz]
[a-c]

Lớp ký tự: Khớp với bất kỳ ký tự nào trong dấu ngoặc vuông. Bạn có thể chỉ định một phạm vi ký tự bằng cách sử dụng dấu gạch ngang, nhưng nếu dấu gạch ngang xuất hiện là ký tự đầu tiên hoặc cuối cùng trong dấu ngoặc vuông, nó được coi là dấu gạch ngang thực sự để đưa vào lớp ký tự như một ký tự thông thường.

Ví dụ, [abcd] giống như [a-d]. Chúng khớp với "b" trong "brisket" và "c" trong "chop".

Ví dụ, [abcd-][-abcd] khớp với "b" trong "brisket", "c" trong "chop" và "-" (dấu gạch ngang) trong "non-profit".

Ví dụ, [\w-] giống như [A-Za-z0-9_-]. Cả hai đều khớp với "b" trong "brisket", "c" trong "chop" và "n" trong "non-profit".

[^xyz]
[^a-c]

Lớp ký tự phủ định: Khớp với bất kỳ thứ gì không nằm trong dấu ngoặc vuông. Bạn có thể chỉ định một phạm vi ký tự bằng cách sử dụng dấu gạch ngang, nhưng nếu dấu gạch ngang xuất hiện là ký tự đầu tiên sau ^ hoặc ký tự cuối cùng trong dấu ngoặc vuông, nó được coi là dấu gạch ngang thực sự để đưa vào lớp ký tự như một ký tự thông thường. Ví dụ, [^abc] giống như [^a-c]. Chúng ban đầu khớp với "o" trong "bacon" và "h" trong "chop".

Lưu ý: Ký tự ^ cũng có thể chỉ ra đầu đầu vào.

.

Wildcard: Khớp với bất kỳ ký tự đơn nào ngoại trừ các ký tự kết thúc dòng: \n, \r, \u2028 hoặc \u2029. Ví dụ, /.y/ khớp với "my" và "ay", nhưng không khớp với "yes", trong "yes make my day", vì không có ký tự nào trước "y" trong "yes". Nếu cờ dotAll (s) được bật, cũng khớp với các ký tự kết thúc dòng. Bên trong một lớp ký tự, dấu chấm mất đi ý nghĩa đặc biệt và khớp với dấu chấm thực sự.

\d

Escape lớp ký tự chữ số: Khớp với bất kỳ chữ số nào (số Ả Rập). Tương đương với [0-9]. Ví dụ, /\d/ hoặc /[0-9]/ khớp với "2" trong "B2 is the suite number".

\D

Escape lớp ký tự không phải chữ số: Khớp với bất kỳ ký tự nào không phải chữ số (số Ả Rập). Tương đương với [^0-9]. Ví dụ, /\D/ hoặc /[^0-9]/ khớp với "B" trong "B2 is the suite number".

\w

Escape lớp ký tự từ: Khớp với bất kỳ ký tự chữ và số nào từ bảng chữ cái Latin cơ bản, bao gồm cả dấu gạch dưới. Tương đương với [A-Za-z0-9_]. Ví dụ, /\w/ khớp với "a" trong "apple", "5" trong "$5.28", "3" trong "3D" và "m" trong "Émanuel".

\W

Escape lớp ký tự không phải từ: Khớp với bất kỳ ký tự nào không phải ký tự từ trong bảng chữ cái Latin cơ bản. Tương đương với [^A-Za-z0-9_]. Ví dụ, /\W/ hoặc /[^A-Za-z0-9_]/ khớp với "%" trong "50%" và "É" trong "Émanuel".

\s

Escape lớp ký tự khoảng trắng: Khớp với một ký tự khoảng trắng đơn, bao gồm dấu cách, tab, form feed, line feed và các khoảng trắng Unicode khác. Tương đương với [\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]. Ví dụ, /\s\w*/ khớp với " bar" trong "foo bar".

\S

Escape lớp ký tự không phải khoảng trắng: Khớp với một ký tự đơn không phải khoảng trắng. Tương đương với [^\f\n\r\t\v\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]. Ví dụ, /\S\w*/ khớp với "foo" trong "foo bar".

\t Khớp với một tab ngang.
\r Khớp với một ký tự carriage return.
\n Khớp với một ký tự linefeed.
\v Khớp với một tab dọc.
\f Khớp với một ký tự form-feed.
[\b] Khớp với một ký tự backspace. Nếu bạn đang tìm kiếm assertion ranh giới từ (\b), xem Assertions.
\0 Khớp với ký tự NUL. Không được theo sau bởi một chữ số khác.
\cX

Khớp với một ký tự điều khiển sử dụng ký hiệu caret, trong đó "X" là một chữ cái từ A–Z hoặc a–z (tương ứng với các code point U+0001U+001A). Ví dụ, /\cM\cJ/ khớp với "\r\n".

\xhh Hex escape: Khớp với ký tự có mã hh (hai chữ số thập lục phân).
\uHHHH Unicode escape: Khớp với một đơn vị mã UTF-16 có giá trị HHHH (bốn chữ số thập lục phân).
\u{H…H} Unicode code point escape: (Chỉ khi cờ u được đặt.) Khớp với ký tự có giá trị Unicode U+H…H (1 đến 6 chữ số thập lục phân).
\p{UnicodeProperty}, \P{UnicodeProperty}

Escape lớp ký tự Unicode: Khớp với một ký tự dựa trên thuộc tính ký tự Unicode của nó: ví dụ, ký tự emoji, ký tự katakana tiếng Nhật, hoặc ký tự Han/Kanji tiếng Trung/Nhật, v.v.).

\

Chỉ ra rằng ký tự tiếp theo nên được xử lý đặc biệt, hay được "thoát". Nó hoạt động theo một trong hai cách.

  • Đối với các ký tự thường được xử lý theo nghĩa đen, chỉ ra rằng ký tự tiếp theo là đặc biệt và không được hiểu theo nghĩa đen. Ví dụ, /b/ khớp với ký tự "b". Bằng cách đặt một dấu gạch chéo ngược trước "b", tức là sử dụng /\b/, ký tự trở nên đặc biệt có nghĩa là khớp ranh giới từ.
  • Đối với các ký tự thường được xử lý đặc biệt, chỉ ra rằng ký tự tiếp theo không đặc biệt và nên được hiểu theo nghĩa đen. Ví dụ, "*" là ký tự đặc biệt có nghĩa là 0 hoặc nhiều lần xuất hiện của ký tự trước đó phải được khớp; ví dụ, /a*/ nghĩa là khớp 0 hoặc nhiều "a". Để khớp * theo nghĩa đen, đặt dấu gạch chéo ngược trước nó; ví dụ, /a\*/ khớp với "a*".

Lưu ý: Để khớp ký tự này theo nghĩa đen, hãy thoát nó bằng chính nó. Nói cách khác, để tìm kiếm \ hãy dùng /\\/.

x|y

Disjunction: Khớp với "x" hoặc "y". Mỗi thành phần, được phân tách bởi dấu gạch đứng (|), được gọi là một lựa chọn thay thế. Ví dụ, /green|red/ khớp với "green" trong "green apple" và "red" trong "red apple".

Lưu ý: Một disjunction là một cách khác để chỉ định "một tập hợp các lựa chọn", nhưng nó không phải là một lớp ký tự. Các disjunction không phải là nguyên tử — bạn cần dùng một nhóm để làm cho nó trở thành một phần của mẫu lớn hơn. [abc] về mặt chức năng tương đương với (?:a|b|c).

Assertions

Assertions bao gồm các ranh giới, chỉ ra điểm bắt đầu và kết thúc của các dòng và từ, và các mẫu khác chỉ ra theo một cách nào đó rằng một kết quả khớp là có thể (bao gồm look-ahead, look-behind và các biểu thức điều kiện).

Assertions kiểu ranh giới

Ký tự Ý nghĩa
^

Assertion đầu ranh giới đầu vào: Khớp với đầu đầu vào. Nếu cờ multiline (m) được bật, cũng khớp ngay sau một ký tự ngắt dòng. Ví dụ, /^A/ không khớp với "A" trong "an A", nhưng khớp với "A" đầu tiên trong "An A".

Lưu ý: Ký tự này có ý nghĩa khác khi nó xuất hiện ở đầu một lớp ký tự.

$

Assertion cuối ranh giới đầu vào: Khớp với cuối đầu vào. Nếu cờ multiline (m) được bật, cũng khớp ngay trước một ký tự ngắt dòng. Ví dụ, /t$/ không khớp với "t" trong "eater", nhưng khớp với nó trong "eat".

\b

Assertion ranh giới từ: Khớp với một ranh giới từ. Đây là vị trí mà một ký tự từ không được theo sau hoặc đứng trước bởi một ký tự từ khác, chẳng hạn như giữa một chữ cái và một dấu cách. Lưu ý rằng một ranh giới từ được khớp không được đưa vào kết quả khớp. Nói cách khác, độ dài của một ranh giới từ được khớp là bằng không.

Ví dụ:

  • /\bm/ khớp với "m" trong "moon".
  • /oo\b/ không khớp với "oo" trong "moon", vì "oo" được theo sau bởi "n" là một ký tự từ.
  • /oon\b/ khớp với "oon" trong "moon", vì "oon" là cuối chuỗi, do đó không được theo sau bởi một ký tự từ.
  • /\w\b\w/ sẽ không bao giờ khớp với bất kỳ thứ gì, vì một ký tự từ không bao giờ có thể được theo sau bởi cả một ký tự không phải từ và một ký tự từ.

Để khớp với một ký tự backspace ([\b]), xem Lớp ký tự.

\B

Assertion không phải ranh giới từ: Khớp với một ranh giới không phải từ. Đây là vị trí mà ký tự trước và sau có cùng loại: Cả hai phải là ký tự từ, hoặc cả hai phải là ký tự không phải từ, ví dụ như giữa hai chữ cái hoặc giữa hai dấu cách. Đầu và cuối chuỗi được coi là không phải từ. Giống như ranh giới từ được khớp, ranh giới không phải từ được khớp cũng không được đưa vào kết quả khớp. Ví dụ, /\Bon/ khớp với "on" trong "at noon" và /ye\B/ khớp với "ye" trong "possibly yesterday".

Các assertions khác

Note: Ký tự ? cũng có thể được dùng như một quantifier.

Ký tự Ý nghĩa
x(?=y)

Assertion lookahead: Khớp với "x" chỉ khi "x" được theo sau bởi "y". Ví dụ, /Jack(?=Sprat)/ khớp với "Jack" chỉ khi nó được theo sau bởi "Sprat".
/Jack(?=Sprat|Frost)/ khớp với "Jack" chỉ khi nó được theo sau bởi "Sprat" hoặc "Frost". Tuy nhiên, cả "Sprat" lẫn "Frost" đều không phải là một phần của kết quả khớp.

x(?!y)

Assertion lookahead phủ định: Khớp với "x" chỉ khi "x" không được theo sau bởi "y". Ví dụ, /\d+(?!\.)/ khớp với một số chỉ khi nó không được theo sau bởi dấu thập phân. /\d+(?!\.)/.exec('3.141') khớp với "141" nhưng không khớp với "3".

(?<=y)x

Assertion lookbehind: Khớp với "x" chỉ khi "x" được đứng trước bởi "y". Ví dụ, /(?<=Jack)Sprat/ khớp với "Sprat" chỉ khi nó được đứng trước bởi "Jack". /(?<=Jack|Tom)Sprat/ khớp với "Sprat" chỉ khi nó được đứng trước bởi "Jack" hoặc "Tom". Tuy nhiên, cả "Jack" lẫn "Tom" đều không phải là một phần của kết quả khớp.

(?<!y)x

Assertion lookbehind phủ định: Khớp với "x" chỉ khi "x" không được đứng trước bởi "y". Ví dụ, /(?<!-)\d+/ khớp với một số chỉ khi nó không được đứng trước bởi dấu trừ. /(?<!-)\d+/.exec('3') khớp với "3". /(?<!-)\d+/.exec('-3') không tìm thấy kết quả khớp vì số được đứng trước bởi dấu trừ.

Nhóm và backreference

Nhóm và backreference chỉ ra các nhóm ký tự biểu thức.

Ký tự Ý nghĩa
(x)

Nhóm bắt giữ: Khớp với x và ghi nhớ kết quả khớp. Ví dụ, /(foo)/ khớp và ghi nhớ "foo" trong "foo bar".

Một biểu thức chính quy có thể có nhiều nhóm bắt giữ. Trong kết quả, các kết quả khớp với nhóm bắt giữ thường nằm trong một mảng có các thành phần theo cùng thứ tự như dấu ngoặc đơn trái trong nhóm bắt giữ. Đây thường chỉ là thứ tự của các nhóm bắt giữ. Điều này trở nên quan trọng khi các nhóm bắt giữ được lồng nhau. Các kết quả khớp được truy cập bằng chỉ mục của các phần tử trong kết quả ([1], …, [n]) hoặc từ các thuộc tính của đối tượng RegExp được định sẵn ($1, …, $9).

Nhóm bắt giữ có một hình phạt về hiệu suất. Nếu bạn không cần chuỗi con được khớp để được ghi nhớ, hãy ưu tiên dấu ngoặc đơn không bắt giữ (xem bên dưới).

String.prototype.match() sẽ không trả về các nhóm nếu cờ /.../g được đặt. Tuy nhiên, bạn vẫn có thể dùng String.prototype.matchAll() để lấy tất cả kết quả khớp.

(?<Name>x)

Nhóm bắt giữ có tên: Khớp với "x" và lưu trữ nó vào thuộc tính groups của kết quả khớp được trả về dưới tên được chỉ định bởi <Name>. Dấu ngoặc góc (<>) là bắt buộc cho tên nhóm.

Ví dụ, để trích xuất mã vùng Hoa Kỳ từ một số điện thoại, chúng ta có thể dùng /\((?<area>\d\d\d)\)/. Kết quả số sẽ xuất hiện trong matches.groups.area.

(?:x)

Nhóm không bắt giữ: Khớp với "x" nhưng không ghi nhớ kết quả khớp. Chuỗi con được khớp không thể được truy xuất từ các phần tử của mảng kết quả ([1], …, [n]) hoặc từ các thuộc tính của đối tượng RegExp được định sẵn ($1, …, $9).

(?flags:x), (?flags-flags:x)

Modifier: Bật hoặc tắt các cờ được chỉ định chỉ cho mẫu được bao gồm. Chỉ các cờ i, ms có thể được dùng trong một modifier.

\n

Backreference: Trong đó "n" là một số nguyên dương. Khớp với cùng chuỗi con được khớp bởi nhóm bắt giữ thứ n trong biểu thức chính quy (đếm dấu ngoặc đơn trái). Ví dụ, /apple(,)\sorange\1/ khớp với "apple, orange," trong "apple, orange, cherry, peach".

\k<Name>

Backreference có tên: Một tham chiếu ngược đến chuỗi con cuối cùng khớp với nhóm bắt giữ có tên được chỉ định bởi <Name>.

Ví dụ, /(?<title>\w+), yes \k<title>/ khớp với "Sir, yes Sir" trong "Do you copy? Sir, yes Sir!".

Lưu ý: \k được dùng theo nghĩa đen ở đây để chỉ ra đầu của một tham chiếu ngược đến nhóm bắt giữ có tên.

Quantifiers

Quantifiers chỉ ra số lượng ký tự hoặc biểu thức cần khớp.

Note: Trong phần sau, item không chỉ đề cập đến các ký tự đơn lẻ, mà còn bao gồm lớp ký tựnhóm và backreference.

Ký tự Ý nghĩa
x*

Khớp với item "x" đứng trước 0 hoặc nhiều lần. Ví dụ, /bo*/ khớp với "boooo" trong "A ghost booooed" và "b" trong "A bird warbled", nhưng không khớp với bất kỳ thứ gì trong "A goat grunted".

x+

Khớp với item "x" đứng trước 1 hoặc nhiều lần. Tương đương với {1,}. Ví dụ, /a+/ khớp với "a" trong "candy" và tất cả các "a" trong "caaaaaaandy".

x?

Khớp với item "x" đứng trước 0 hoặc 1 lần. Ví dụ, /e?le?/ khớp với "el" trong "angel" và "le" trong "angle."

Nếu được dùng ngay sau bất kỳ quantifier nào trong số *, +, ? hoặc {}, làm cho quantifier trở nên non-greedy (khớp số lần tối thiểu), ngược lại với mặc định là greedy (khớp số lần tối đa).

x{n}

Trong đó "n" là một số nguyên không âm, khớp chính xác "n" lần xuất hiện của item "x" đứng trước. Ví dụ, /a{2}/ không khớp với "a" trong "candy", nhưng nó khớp với tất cả "a" trong "caandy" và hai "a" đầu tiên trong "caaandy".

x{n,}

Trong đó "n" là một số nguyên không âm, khớp ít nhất "n" lần xuất hiện của item "x" đứng trước. Ví dụ, /a{2,}/ không khớp với "a" trong "candy", nhưng khớp với tất cả a trong "caandy" và trong "caaaaaaandy".

x{n,m}

Trong đó "n" và "m" là các số nguyên không âm và m >= n, khớp ít nhất "n" và tối đa "m" lần xuất hiện của item "x" đứng trước. Ví dụ, /a{1,3}/ không khớp với bất kỳ thứ gì trong "cndy", khớp "a" trong "candy", hai "a" trong "caandy" và ba "a" đầu tiên trong "caaaaaaandy". Lưu ý rằng khi khớp "caaaaaaandy", kết quả khớp là "aaa", mặc dù chuỗi gốc có nhiều "a" hơn.

x*?
x+?
x??
x{n}?
x{n,}?
x{n,m}?

Mặc định các quantifier như *+ là "greedy", nghĩa là chúng cố gắng khớp nhiều lần nhất có thể. Ký tự ? sau quantifier làm cho quantifier trở thành "non-greedy": nghĩa là nó sẽ dừng lại ngay khi tìm thấy số kết quả khớp tối thiểu. Ví dụ, cho một chuỗi như "some <foo> <bar> new </bar> </foo> thing":

  • /<.*>/ sẽ khớp với "<foo> <bar> new </bar> </foo>"
  • /<.*?>/ sẽ khớp với "<foo>"

Lưu ý: Thêm ? sau {n} là hợp lệ về mặt cú pháp nhưng thực tế không có ý nghĩa gì. Vì {n} luôn khớp chính xác n lần, x{n}? hoạt động giống như x{n}.