ES2018 引入了一种新的类的写法\p{...}和\P{...},允许正则表达式匹配符合 Unicode 某种属性的所有字符。
\P{…}是\p{…}的反向匹配,即匹配不满足条件的字符。
注意,这两种类只对 Unicode 有效,所以使用的时候一定要加上u修饰符。
如果不加u修饰符,正则表达式使用\p和\P会报错,ECMAScript 预留了这两个类。
由于 Unicode 的各种属性非常多,所以这种新的类的表达能力非常强。
Unicode 属性类要指定属性名和属性值。
\p{UnicodePropertyName=UnicodePropertyValue}
对于某些属性,可以只写属性名,或者只写属性值。
\p{UnicodePropertyName}
\p{UnicodePropertyValue}
| 属性名 | 属性含义 |
|---|---|
| Decimal_Number | 匹配所有十进制字符 |
| Number | 匹配所有罗马数字字符 |
| White_Space | 匹配所有空格 |
| Arrows | 匹配所有箭头字符 |
| Alphabetic | 匹配所有字母字符 |
| Mark | 匹配所有符号字符 |
| Connector_Punctuation | 匹配所有连接标点符字符 |
| Join_Control | 匹配所有控制字符 |
| Emoji | 匹配所有Emoji字符 |
| Emoji_Modifier | 匹配所有Emoji Modifie字符 |
| Emoji_Modifier_Base | 匹配所有基础表情字符 |
| Emoji_Presentation | 匹配所有Emoji Presentation字符 |
((log) => {
const regexGreekSymbol = /\p{Script=Greek}/u;
log(regexGreekSymbol.test('π')); // true
})(console.log)
上面代码中,\p{Script=Greek}指定匹配一个希腊文字母,所以匹配π成功。
((log) => {
// 匹配所有的箭头字符 目前还没有支持
const regexArrows = /^\p{Block=Arrows}+$/u;
log(regexArrows.test('←↑→↓↔↕↖↗↘↙⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇧⇩')); // true
})(console.log)
((log) => {
const regex = /^\p{Decimal_Number}+$/u;
log(regex.test('𝟏𝟐𝟑𝟜𝟝𝟞𝟩𝟪𝟫𝟬𝟭𝟮𝟯𝟺𝟻𝟼')); // true
})(console.log)
上面代码中,属性类指定匹配所有十进制字符,可以看到各种字型的十进制字符都会匹配成功。
\p{Number}甚至能匹配罗马数字。
((log) => {
// 匹配所有数字
const regex = /^\p{Number}+$/u;
log(regex.test('²³¹¼½¾')); // true
log(regex.test('㉛㉜㉝')); // true
log(regex.test('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ')); // true
})(console.log)
((log) => {
// 匹配各种文字的所有字母,等同于 Unicode 版的 \w
[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
// 匹配各种文字的所有非字母的字符,等同于 Unicode 版的 \W
[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
})(console.log)
((log) => {
// 匹配 Emoji
const regexEmoji = /\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu;
const testEmoji = '😂😘😍😊😁😭😜😝😄';
log(regexEmoji.test(testEmoji));// true
})(console.log)