Unicode 属性类

基础说明 #

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}指定匹配一个希腊文字母,所以匹配π成功。


Arrows #

((log) => {
    // 匹配所有的箭头字符 目前还没有支持
    const regexArrows = /^\p{Block=Arrows}+$/u;
    log(regexArrows.test('←↑→↓↔↕↖↗↘↙⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇧⇩')); // true
})(console.log)

Decimal_Number #

((log) => {
    const regex = /^\p{Decimal_Number}+$/u;
    log(regex.test('𝟏𝟐𝟑𝟜𝟝𝟞𝟩𝟪𝟫𝟬𝟭𝟮𝟯𝟺𝟻𝟼')); // true
})(console.log)

上面代码中,属性类指定匹配所有十进制字符,可以看到各种字型的十进制字符都会匹配成功。


Number #

\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)

Emoji #

((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)

Build by Loppo 0.6.16