Unicode字符类转义:\p{…},\p{…{

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2015年7月.

A类unicode字符类转义是一种字符类转义与Unicode属性指定的一组字符相匹配的。它仅在中受支持Unicode软件模式。当v(v)标志被启用时,它还可以用于匹配有限长字符串。

试试看

语法

正则表达式
\p{loneProperty}\P{loneProperty}\p{属性=值}\P{属性=值}

参数

lone属性

一个单独的Unicode属性名称或值,语法与价值。它指定常规_类别属性,或二进制属性名称.英寸v(v)模式,它也可以是字符串的二进制Unicode属性.

注: 重症监护室语法允许省略脚本属性名称,但JavaScript不支持这一点,因为大多数时候脚本_扩展脚本.

财产

Unicode属性名。必须由ASCII码字母(A–Z,a–z)和下划线(_),并且必须是非二进制属性名称.

价值

Unicode属性值。必须由ASCII字母组成(A–Z,a–z),下划线(_)、和数字(0–9),并且必须是中列出的受支持的值之一属性值别名.txt.

描述

\对\P(P)仅在中受支持Unicode软件模式。在Unicode-unaware模式下,它们是身份逃逸对于第页P(P)性格。

每个Unicode字符都有一组描述它的属性常规_类别具有值的属性小写_字母、和脚本具有值的属性拉丁语. The\对\P(P)转义序列允许您根据字符的属性匹配字符。例如,可以与匹配\p{小写字母}常规_类别属性名是可选的)以及\p{Script=Latn}.\P(P)创建一个补码类它由没有指定属性的代码点组成。

要组合多个属性,请使用字符集交集使用启用的语法v(v)标记,或查看模式减法和交集.

v(v)模式,\对可以匹配在Unicode中定义为“字符串属性”的代码点序列。这对表情符号最有用,因为表情符号通常由多个代码点组成。然而,\P(P)只能补充字符属性。

注:计划将字符串特性移植到u个模式。

示例

一般类别

常规类别用于对Unicode字符进行分类,子类别可用于定义更精确的分类。在Unicode属性转义中可以同时使用短形式或长形式。

它们可以用于匹配字母、数字、符号、标点符号、空格等。有关更详尽的一般类别列表,请参阅Unicode规范.

js型
//查找文本中的所有字母const story=“这是柴郡猫:现在我要找个人谈谈。”;//最明确的形式story.match(/\p{General_Category=Letter}/gu);//对于常规类别,不强制使用属性名称story.match(/\p{Letter}/gu);//这是等效的(短别名):故事匹配(/\p{L}/gu);//这也是等效的(使用短别名连接所有子类别)故事匹配(/\p{Lu}|\p{Ll}|\p{Lt}|\p2{Lm}|\p-{Lo}/gu);

脚本和脚本扩展

有些语言的书写系统使用不同的脚本。例如,英语和西班牙语使用拉丁字母书写,而阿拉伯语和俄语使用其他字母(分别是阿拉伯语和西里尔字母)书写。这个脚本脚本_扩展Unicode属性允许正则表达式根据主要用于的脚本匹配字符(脚本)或者根据它们所属的脚本集(脚本_扩展).

例如,A类属于拉丁语脚本和ε希腊人脚本。

js型
const mixedCharacters=“εЛ”;//使用脚本的规范“长”名称mixedCharacters.match(/\p{Script=Latin}/u);////为脚本使用短别名(ISO 15924代码)mixedCharacters.match(/\p{Script=Grek}/u);//ε//对Script属性使用短名称scmixedCharacters.match(/\p{sc=Cyrillic}/u);//Л

有关更多详细信息,请参阅Unicode规范,的ECMAScript规范中的脚本表、和ISO 15924脚本代码列表.

如果在一组有限的脚本中使用字符脚本属性将只匹配“主要”使用的脚本。如果我们想根据“非污染物”脚本匹配字符,可以使用脚本_扩展财产(Scx公司简称)。

js型
//٢是阿拉伯-印度符号中的数字2//而它主要是用阿拉伯语书写的//它也可以用塔纳文字书写“٢”.match(/\p{Script=Thana}/u);//空,因为塔纳不是主要的剧本“٢”.match(/\p{Script_Extensions=Thana}/u);//[“٢”,索引:0,输入:“\1634]”,组:未定义]

Unicode属性转义与字符类

使用JavaScript正则表达式,还可以使用字符类尤其是\w个\d日匹配字母或数字。但是,此类表单只匹配拉丁语脚本(换句话说,z(z)A类Z对于\w个09对于\d日). 如所示这个例子,使用非拉丁语文本可能有点笨拙。

Unicode属性转义类别包含更多字符和\p{字母}\p{数字}适用于任何脚本。

js型
//尝试使用范围来避免限制:const non-EnglishText=“ПрикааненирАЛистраоеаебуДес”;const regexpBMPWord=/([\u0000-\u0019\u0021-\uFFFF])+/gu;//BMP经过U+0000到U+FFFF,但空格是U+0020console.table(非英语文本匹配(regexpBMPWord));//改为使用Unicode属性转义const regexpUPE=/\p{L}+/gu;console.table(非英语文本匹配(regexpUPE));

匹配的价格

以下示例匹配字符串中的价格:

js型
函数getPrices(str){//Sc代表“货币符号”return[…str.matchAll(/\p{Sc}\s*[\d.,]+/gu)].map((match)=>match[0]);}const str=`California滚动6.99美元松脆卷8.49美元天妇罗虾$10.99`;console.log(getPrices(str));//["$6.99", "$8.49", "$10.99"]const str2=`美国商店19.99美元欧洲商店18.99欧元日本商店2000元人民币;console.log(getPrices(str2));//["$19.99", "€18.99", "¥2000"]

匹配字符串

使用v(v)标志,\p{…}通过使用字符串的属性,可以匹配可能长于一个字符的字符串:

js型
const标志=“🇺🇳";console.log(flag.length);//2控制台.log(/\p{RGI_Emoji_Flag_Sequence}/v.exec(标志));//[ '🇺🇳' ]

但是,您不能使用\P(P)匹配“没有属性的字符串”,因为不清楚应该使用多少字符。

js型
/\P{RGI_Emoji_Flag_Sequence}/v;//语法错误:正则表达式无效:属性名无效

规格

规范
ECMAScript语言规范
#prod-CharacterClassEscape

浏览器兼容性

BCD表仅在浏览器中加载

另请参见