Character classes

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

Try it

const chessStory = "He played the King in a8 and she moved her Queen in c2.";
const regexpCoordinates = /\w\d/g;
console.log(chessStory.match(regexpCoordinates));
// Expected output: Array [ 'a8', 'c2']

const moods = "happy 🙂, confused 😕, sad 😢";
const regexpEmoticons = /[\u{1F600}-\u{1F64F}]/gu;
console.log(moods.match(regexpEmoticons));
// Expected output: Array ['🙂', '😕', '😢']

Các loại

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

Character class: Khớp với bất kỳ ký tự nào trong số các ký tự được bao quanh. 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 ở đầu hoặc cuối các ký tự được bao quanh bởi dấu ngoặc vuông, nó được coi là dấu gạch ngang literal được đưa vào character class như một ký tự thông thường.

Ví dụ, [abcd] giống với [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 với [A-Za-z0-9_-]. Cả hai đều khớp với "b" trong "brisket", "c" trong "chop", và "n" trong "non-profit".

Khi cờ unicodeSets (v) được bật, character class có thêm một số tính năng. Xem tài liệu tham khảo character class để biết thêm thông tin.

[^xyz]
[^a-c]

Negated character class: Khớp với bất cứ thứ gì không nằm trong dấu ngoặc vuông. Bạn có thể chỉ định 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 ở vị trí đầ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 literal được đưa vào character class như một ký tự thông thường. Ví dụ, [^abc] giống với [^a-c]. Ban đầu chúng 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ừ 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ự trước "y" trong "yes". Nếu cờ dotAll (s) được bật, cũng khớp với ký tự kết thúc dòng. Bên trong một character class, dấu chấm mất ý nghĩa đặc biệt và khớp với một dấu chấm literal.

\d

Digit character class escape: Khớp với bất kỳ chữ số nào (chữ số Arabic). 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

Non-digit character class escape: Khớp với bất kỳ ký tự nào không phải chữ số (chữ số Arabic). 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

Word character class escape: 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

Non-word character class escape: Khớp với bất kỳ ký tự nào không phải ký tự từ từ 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

White space character class escape: 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

Non-white space character class escape: 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 tab ngang.
\r Khớp với carriage return.
\n Khớp với linefeed.
\v Khớp với tab dọc.
\f Khớp với form-feed.
[\b] Khớp với backspace. Nếu bạn đang tìm assertion ranh giới từ (\b), xem Assertions.
\0 Khớp với ký tự NUL. Không theo sau ký tự này bằng một chữ số khác.
\cX

Khớp với ký tự điều khiển sử dụng caret notation, trong đó "X" là một chữ cái từ A–Z hoặc a–z (tương ứng với code points 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 UTF-16 code-unit 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}

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

\

Chỉ ra rằng ký tự tiếp theo nên được xử lý đặc biệt, hoặc "escaped". Nó có một trong hai hành vi.

  • Đố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 dấu gạch chéo ngược trước "b", nghĩa là bằng cách sử dụng /\b/, ký tự trở thành đặ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*/ có 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 với ký tự này theo nghĩa đen, hãy escape nó với 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 ký tự pipe (|), được gọi là một alternative. Ví dụ, /green|red/ khớp với "green" trong "green apple" và "red" trong "red apple".

Lưu ý: 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 character class. Disjunctions không phải là atoms — bạn cần sử dụng một group để biến nó thành một phần của mẫu lớn hơn. [abc] tương đương về chức năng với (?:a|b|c).

Ví dụ

Tìm kiếm một chuỗi chữ số

Trong ví dụ này, ta khớp một chuỗi 4 chữ số với \d{4}. \b chỉ ra ranh giới từ (tức là không bắt đầu hoặc kết thúc khớp ở giữa một chuỗi số).

js
const randomData = "015 354 8787 687351 3512 8735";
const regexpFourDigits = /\b\d{4}\b/g;

console.table(randomData.match(regexpFourDigits));
// ['8787', '3512', '8735']

Xem thêm ví dụ trong tài liệu tham khảo character class escape.

Tìm kiếm một từ (từ bảng chữ cái Latin) bắt đầu bằng A

Trong ví dụ này, ta khớp một từ bắt đầu bằng chữ A. \b chỉ ra ranh giới từ (tức là không bắt đầu khớp ở giữa một từ). [aA] chỉ ra chữ cái "a" hoặc "A". \w+ chỉ ra bất kỳ ký tự nào từ bảng chữ cái Latin, nhiều lần (+ là một quantifier). Lưu ý rằng vì ta đã khớp cho đến khi không còn ký tự từ nào nữa, ranh giới \b cuối không cần thiết.

js
const aliceExcerpt =
  "I'm sure I'm not Ada,' she said, 'for her hair goes in such long ringlets, and mine doesn't go in ringlets at all.";
const regexpWordStartingWithA = /\b[aA]\w+/g;

console.table(aliceExcerpt.match(regexpWordStartingWithA));
// ['Ada', 'and', 'at', 'all']

Xem thêm ví dụ trong tài liệu tham khảo character class escape.

Tìm kiếm một từ (từ ký tự Unicode)

Thay vì bảng chữ cái Latin, ta có thể sử dụng một phạm vi ký tự Unicode để xác định một từ (do đó có thể xử lý văn bản bằng các ngôn ngữ khác như tiếng Nga hoặc tiếng Ả Rập). "Basic Multilingual Plane" của Unicode chứa hầu hết các ký tự được sử dụng trên thế giới và ta có thể sử dụng character classes và phạm vi để khớp các từ được viết bằng những ký tự đó.

js
const nonEnglishText = "Приключения Алисы в Стране чудес";
const regexpBMPWord = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
// BMP goes through U+0000 to U+FFFF but space is U+0020

console.table(nonEnglishText.match(regexpBMPWord));
["Приключения", "Алисы", "в", "Стране", "чудес"];

Xem thêm ví dụ trong tài liệu tham khảo Unicode character class escape.

Đếm nguyên âm

Trong ví dụ này, ta đếm số nguyên âm (A, E, I, O, U, Y) trong một đoạn văn bản. Cờ g được dùng để khớp tất cả các lần xuất hiện của mẫu trong văn bản. Cờ i được dùng để làm mẫu không phân biệt chữ hoa chữ thường, do đó nó khớp cả nguyên âm chữ hoa và chữ thường.

js
const aliceExcerpt =
  "There was a long silence after this, and Alice could only hear whispers now and then.";
const regexpVowels = /[aeiouy]/gi;

console.log("Number of vowels:", aliceExcerpt.match(regexpVowels).length);
// Number of vowels: 26

Xem thêm