跳到主要内容

4.4 Unicode 属性转义

Unicode 属性转义支持根据 Unicode 属性进行匹配,例如我们可以用它来匹配出表情、标点符号、字母(甚至适用特定语言或文字)等。同一符号可以拥有多种 Unicode 属性,属性则有 binary ("boolean-like") 和 non-binary 之分。

\p{Emoji}
在工具中查看
大家好,我是何方,欢迎来到https://iamhefang.cn,😀
注意

使用 Unicode 属性转义依靠 \u 标识, \u 表示该字符串被视为一串 Unicode 代码点。参考 RegExp.prototype.nicode.

注意

某些 Unicode 属性比字符类(如 \w 只匹配拉丁字母 a 到 z)包含更多的字符 ,但后者浏览器兼容性更好 (截至 2020 一月).

语法

\p{Unicode属性名=Unicode属性值}
\p{Unicode属性值}

\p{UnicodeBinary属性名}

// \P\p 取反
\P{Unicode属性值}
\P{UnicodeBinary属性名}
Unicode 属性名说明
General_CategoryGeneral categories 对 Unicode 字符进行分类,子类别用于精确定义类别。长名和简写的 Unicode 属性转义都可用.
Script某字符用于多种文字时,Script 优先匹配最主要使用那个字符的文字。
Script_Extensions如果想要根据非主要的文字进行匹配,我们可以使用 Script_Extensions 属性 (简写为 Scx).
UnicodeBinary 属性名说明
ASCIIASCII 字符
Alpha具有字母顺序的字符
EmojiEmoji 表情符
Hex_Digit16 进制数字
White_Space空白字符

下面是 ASCII 字符的简写形式

简写全称说明
LLetter字符
LuUppercase Letter大写字符
LlLowercase Letter小写字符
LtTitlecase Letter标题字符
LmModifier Letter修饰符
LoOther Letter其他字符
MMark标记
MnNon-Spacing Mark
McSpacing Combining Mark
MeEnclosing Mark
NNumber数字
NdDecimal Digit Number
NlLetter Number
NoOther Number
SSymbol符号
SmMath Symbol数学符号
ScCurrency Symbol
SkModifier Symbol
SoOther Symbol
PPunctuation标点符号
PcConnector Punctuation下划线
PdDash Punctuation破折号/减号
PsOpen Punctuation左括号 ( , [ , {
PeClose Punctuation右括号 ) , ] , }
PiInitial Punctuation
PfFinal Punctuation
PoOther Punctuation不在上面几种标点内的其他标点
ZSeparator分隔符
ZsSpace Separator空白分隔符
ZlLine Separator行分隔符
ZpParagraph Separator段落分隔符
COther其他
CcControl控制字符
CfFormat格式字符
CsSurrogate
CoPrivate Use
CnUnassigned
注意

因为可使用的属性和值太多,这里不一一赘述,仅提供几个例子。

General Category

General categories 对 Unicode 字符进行分类,子类别用于精确定义类别。长名和简写的 Unicode 属性转义都可用。它们可匹配字母、数字、符号、标点符号、空格等等。

下面几种模式的匹配结果是一样的:

General_Category=Letter

\p{General_Category=Letter}
在工具中查看
It's the Cheshire Cat: now I shall have somebody to talk to.

Letter

\p{Letter}
在工具中查看
It's the Cheshire Cat: now I shall have somebody to talk to.

L

\p{L}
在工具中查看
It's the Cheshire Cat: now I shall have somebody to talk to.

其他

\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}
在工具中查看
It's the Cheshire Cat: now I shall have somebody to talk to.

Script

某些语言使用不同的文字,如英语和西班牙语使用拉丁文,而阿拉伯语和俄语用阿拉伯文和俄文。Script 和 Script_Extensions Unicode 属性允许正则表达式根据字符所属的文字或该文字所属的文字扩充进行匹配。

比如,"a" 属于拉丁(Latin)文,"ε" 属于希腊(Greek)文,"Л"属于西里尔(Cyrillic)文,"何"属于中文。

匹配拉丁文

\p{Script=Latin}
在工具中查看
aεЛ何

匹配希腊文

\p{Script=Grek}
在工具中查看
aεЛ何

匹配西里尔文

\p{Script=Cyrillic}
在工具中查看
Л

匹配中文

\p{Script=Han}
在工具中查看
aεЛ

Script_Extensions

某字符用于多种文字时,Script 优先匹配最主要使用那个字符的文字。如果想要根据非主要的文字进行匹配,我们可以使用 Script_Extensions 属性。

比如: {texts.Script_Extensions} 是阿拉伯-印度符号中的数字 2,虽然它主要用阿拉伯文字书写,但也可以用塔安那 (Thaana) 文字书写,在使用 Script=Thaana 时无法匹配到结果,但在使用 Script_Extensions=Thaana 就可以匹配到结果。

使用 Script

\p{Script=Thaana}
在工具中查看
٢

使用 Script_Extensions

\p{Script_Extensions=Thaana}
在工具中查看
٢

属性转义 VS 字符类

JavaScript 正则表达式可以使用 字符类 尤其是 \w\d 匹配字母或数字,然而,这样的形式只匹配拉丁文字的字符 (换言之,a 到 z、 A 到 Z 的 \w 和 0 到 9 的 \d ),见例子,这样的使用放到非拉丁文本中是有些蠢的。

Unicode 属性转义 categories 包含更多字符, \p{Letter}\p{Number} 将会适用于任何文字。

使用字符类

[\u0000-\u0019\u0021-\uFFFF]+
在工具中查看
Приключения Алисы в Стране чудес

使用属性转义

\p{L}+
在工具中查看
Приключения Алисы в Стране чудес

上面使用字符类和使用属性转义的结果是一样的,但使用属性转义可以让模式简洁的多。

该内容基于 Unicode property escapes - JavaScript | MDN 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第四章-使用元字符/4.4-Unicode属性转义