Unicode character class escape: \p{...}, \P{...}
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2020.
Một unicode character class escape là một loại character class escape khớp một tập hợp ký tự được chỉ định bởi một thuộc tính Unicode. Nó chỉ được hỗ trợ trong Unicode-aware mode. Khi flag v được bật, nó cũng có thể được sử dụng để khớp các chuỗi có độ dài hữu hạn.
Try it
const sentence = "A ticket to 大阪 costs ¥2000 👌.";
const regexpEmojiPresentation = /\p{Emoji_Presentation}/gu;
console.log(sentence.match(regexpEmojiPresentation));
// Expected output: Array ["👌"]
const regexpNonLatin = /\P{Script_Extensions=Latin}+/gu;
console.log(sentence.match(regexpNonLatin));
// Expected output: Array [" ", " ", " 大阪 ", " ¥2000 👌."]
const regexpCurrencyOrPunctuation = /\p{Sc}|\p{P}/gu;
console.log(sentence.match(regexpCurrencyOrPunctuation));
// Expected output: Array ["¥", "."]
Cú pháp
\p{loneProperty}
\P{loneProperty}
\p{property=value}
\P{property=value}
Tham số
loneProperty-
Một tên hoặc giá trị thuộc tính Unicode đơn lẻ, theo cùng cú pháp như
value. Nó chỉ định giá trị cho thuộc tínhGeneral_Category, hoặc một tên thuộc tính nhị phân. Trong chế độv, nó cũng có thể là một thuộc tính nhị phân Unicode của chuỗi.Note: Cú pháp ICU cho phép bỏ qua tên thuộc tính
Scriptcũng vậy, nhưng JavaScript không hỗ trợ điều này, vì hầu hết thời gianScript_Extensionshữu ích hơnScript. property-
Tên thuộc tính Unicode. Phải được tạo thành từ các chữ cái ASCII (
A–Z,a–z) và dấu gạch dưới (_), và phải là một trong các tên thuộc tính không nhị phân. value-
Giá trị thuộc tính Unicode. Phải được tạo thành từ các chữ cái ASCII (
A–Z,a–z), dấu gạch dưới (_), và chữ số (0–9), và phải là một trong các giá trị được hỗ trợ được liệt kê trongPropertyValueAliases.txt.
Mô tả
\p và \P chỉ được hỗ trợ trong Unicode-aware mode. Trong Unicode-unaware mode, chúng là identity escapes cho ký tự p hoặc P.
Mỗi ký tự Unicode có một tập hợp các thuộc tính mô tả nó. Ví dụ, ký tự a có thuộc tính General_Category với giá trị Lowercase_Letter, và thuộc tính Script với giá trị Latn. Các escape sequences \p và \P cho phép bạn khớp một ký tự dựa trên các thuộc tính của nó. Ví dụ, a có thể được khớp bởi \p{Lowercase_Letter} (tên thuộc tính General_Category là tùy chọn) cũng như \p{Script=Latn}. \P tạo ra một complement class bao gồm các code points không có thuộc tính được chỉ định.
Khi flag i được đặt, các character classes \P được xử lý hơi khác trong chế độ u và v. Trong chế độ u, case-folding xảy ra sau phép trừ; trong chế độ v, case-folding xảy ra trước phép trừ. Cụ thể hơn, trong chế độ u, \P{property} khớp caseFold(allCharacters - charactersWithProperty). Điều này có nghĩa là /\P{Lowercase_Letter}/iu vẫn khớp "a", vì A không phải là Lowercase_Letter. Trong chế độ v, \P{property} khớp caseFold(allCharacters) - caseFold(charactersWithProperty). Điều này có nghĩa là /\P{Lowercase_Letter}/iv không khớp "a", vì A thậm chí không nằm trong tập hợp tất cả các ký tự Unicode được fold. Xem thêm complement classes và khớp không phân biệt hoa/thường.
Để kết hợp nhiều thuộc tính, hãy sử dụng cú pháp character set intersection được bật với flag v, hoặc xem phép trừ và giao pattern.
Trong chế độ v, \p có thể khớp một chuỗi các code points, được định nghĩa trong Unicode là "properties of strings". Điều này hữu ích nhất cho emojis, thường được tạo thành từ nhiều code points. Tuy nhiên, \P chỉ có thể bổ sung các thuộc tính ký tự.
Note:
Có kế hoạch chuyển tính năng properties of strings sang chế độ u cũng vậy.
Ví dụ
>Danh mục chung
Danh mục chung được sử dụng để phân loại các ký tự Unicode và các danh mục con có sẵn để định nghĩa phân loại chính xác hơn. Có thể sử dụng cả dạng ngắn hoặc dạng dài trong Unicode property escapes.
Chúng có thể được sử dụng để khớp các chữ cái, số, ký hiệu, dấu câu, dấu cách, v.v. Để có danh sách đầy đủ hơn về các danh mục chung, vui lòng tham khảo đặc tả Unicode.
// finding all the letters of a text
const story = "It's the Cheshire Cat: now I shall have somebody to talk to.";
// Most explicit form
story.match(/\p{General_Category=Letter}/gu);
// It is not mandatory to use the property name for General categories
story.match(/\p{Letter}/gu);
// This is equivalent (short alias):
story.match(/\p{L}/gu);
// This is also equivalent (conjunction of all the subcategories using short aliases)
story.match(/\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}/gu);
Scripts và script extensions
Một số ngôn ngữ sử dụng các scripts khác nhau cho hệ thống viết của họ. Ví dụ, tiếng Anh và tiếng Tây Ban Nha được viết bằng chữ Latin trong khi tiếng Ả Rập và tiếng Nga được viết bằng các scripts khác (lần lượt là tiếng Ả Rập và tiếng Cyrillic). Các thuộc tính Unicode Script và Script_Extensions cho phép regular expression khớp các ký tự theo script chúng được sử dụng chủ yếu (Script) hoặc theo tập hợp các scripts chúng thuộc về (Script_Extensions).
Ví dụ, A thuộc script Latin và ε thuộc script Greek.
const mixedCharacters = "aεЛ";
// Using the canonical "long" name of the script
mixedCharacters.match(/\p{Script=Latin}/u); // a
// Using a short alias (ISO 15924 code) for the script
mixedCharacters.match(/\p{Script=Grek}/u); // ε
// Using the short name sc for the Script property
mixedCharacters.match(/\p{sc=Cyrillic}/u); // Л
Để biết thêm chi tiết, hãy tham khảo đặc tả Unicode, bảng Scripts trong đặc tả ECMAScript, và danh sách mã script ISO 15924.
Nếu một ký tự được sử dụng trong một tập hợp hạn chế các scripts, thuộc tính Script sẽ chỉ khớp cho script được sử dụng "chủ yếu". Nếu chúng ta muốn khớp các ký tự dựa trên script "không chủ yếu", chúng ta có thể sử dụng thuộc tính Script_Extensions (viết tắt là scx).
// ٢ is the digit 2 in Arabic-Indic notation
// while it is predominantly written within the Arabic script
// it can also be written in the Thaana script
"٢".match(/\p{Script=Thaana}/u);
// null as Thaana is not the predominant script
"٢".match(/\p{Script_Extensions=Thaana}/u);
// ["٢", index: 0, input: "٢", groups: undefined]
Unicode property escapes so với character classes
Với JavaScript regular expressions, cũng có thể sử dụng character classes và đặc biệt là \w hoặc \d để khớp các chữ cái hoặc chữ số. Tuy nhiên, các dạng như vậy chỉ khớp các ký tự từ script Latin (nói cách khác, a đến z và A đến Z cho \w và 0 đến 9 cho \d). Như được hiển thị trong ví dụ này, có thể hơi bất tiện khi làm việc với các văn bản không phải Latin.
Các danh mục Unicode property escapes bao gồm nhiều ký tự hơn nhiều và \p{Letter} hoặc \p{Number} sẽ hoạt động cho bất kỳ script nào.
// Trying to use ranges to avoid \w limitations:
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));
// Using Unicode property escapes instead
const regexpUPE = /\p{L}+/gu;
console.table(nonEnglishText.match(regexpUPE));
Khớp giá cả
Ví dụ sau khớp các giá cả trong một chuỗi:
function getPrices(str) {
// Sc stands for "currency symbol"
return [...str.matchAll(/\p{Sc}\s*[\d.,]+/gu)].map((match) => match[0]);
}
const str = `California rolls $6.99
Crunchy rolls $8.49
Shrimp tempura $10.99`;
console.log(getPrices(str)); // ["$6.99", "$8.49", "$10.99"]
const str2 = `US store $19.99
Europe store €18.99
Japan store ¥2000`;
console.log(getPrices(str2)); // ["$19.99", "€18.99", "¥2000"]
Khớp chuỗi
Với flag v, \p{…} có thể khớp các chuỗi có thể dài hơn một ký tự bằng cách sử dụng thuộc tính của chuỗi:
const flag = "🇺🇳";
console.log(flag.length); // 2
console.log(/\p{RGI_Emoji_Flag_Sequence}/v.exec(flag)); // [ '🇺🇳' ]
Tuy nhiên, bạn không thể sử dụng \P để khớp "một chuỗi không có thuộc tính", vì không rõ bao nhiêu ký tự sẽ được tiêu thụ.
/\P{RGI_Emoji_Flag_Sequence}/v; // SyntaxError: Invalid regular expression: Invalid property name
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # prod-CharacterClassEscape> |
Tương thích trình duyệt
Xem thêm
- Hướng dẫn Character classes
- Regular expressions
- Character class:
[...],[^...] - Character class escape:
\d,\D,\w,\W,\s,\S - Character escape:
\n,\u{...} - Disjunction:
| - Unicode character property trên Wikipedia
- ES2018: RegExp Unicode property escapes bởi Dr. Axel Rauschmayer (2017)
- Unicode regular expressions § Properties
- Unicode Utilities: UnicodeSet
- RegExp v flag with set notation and properties of strings on v8.dev (2022)