Unicode 属性类

ES2018 引入了一种新的类的写法\p{...}\P{...},允许正则表达式匹配符合 Unicode 某种属性的所有字符。

  1. const regexGreekSymbol = /\p{Script=Greek}/u;
  2. regexGreekSymbol.test('π') // true

上面代码中,\p{Script=Greek}指定匹配一个希腊文字母,所以匹配π成功。

Unicode 属性类要指定属性名和属性值。

  1. \p{UnicodePropertyName=UnicodePropertyValue}

对于某些属性,可以只写属性名,或者只写属性值。

  1. \p{UnicodePropertyName}
  2. \p{UnicodePropertyValue}

\P{…}\p{…}的反向匹配,即匹配不满足条件的字符。

注意,这两种类只对 Unicode 有效,所以使用的时候一定要加上u修饰符。如果不加u修饰符,正则表达式使用\p\P会报错,ECMAScript 预留了这两个类。

由于 Unicode 的各种属性非常多,所以这种新的类的表达能力非常强。

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

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

\p{Number}甚至能匹配罗马数字。

  1. // 匹配所有数字
  2. const regex = /^\p{Number}+$/u;
  3. regex.test('²³¹¼½¾') // true
  4. regex.test('㉛㉜㉝') // true
  5. regex.test('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ') // true

下面是其他一些例子。

  1. // 匹配所有空格
  2. \p{White_Space}
  3. // 匹配各种文字的所有字母,等同于 Unicode 版的 \w
  4. [\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
  5. // 匹配各种文字的所有非字母的字符,等同于 Unicode 版的 \W
  6. [^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
  7. // 匹配 Emoji
  8. /\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu
  9. // 匹配所有的箭头字符
  10. const regexArrows = /^\p{Block=Arrows}+$/u;
  11. regexArrows.test('←↑→↓↔↕↖↗↘↙⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇧⇩') // true