欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

正则表达式匹配Unicode属性类使用技巧

程序员文章站 2022-07-09 15:59:58
Unicode 属性类 目前,有一个提案,引入了一种新的类的写法\p{...}和\P{...},允许正则表达式匹配符合 Unicode 某种属性的所有字符。 con...

Unicode 属性类

目前,有一个提案,引入了一种新的类的写法\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}

\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('231???') // true
  4. regex.test('???') // true
  5. regex.test('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ') // true

下面是其他一些例子。


  1. // 匹配各种文字的所有字母,等同于 Unicode 版的 \w
  2. [\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
  3.  
  4. // 匹配各种文字的所有非字母的字符,等同于 Unicode 版的 \W
  5. [^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]
  6.  
  7. // 匹配所有的箭头字符
  8. const regexArrows = /^\p{Block=Arrows}+$/u;
  9. regexArrows.test('←↑→↓??↖↗↘↙?????????????') // true