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_Category | General categories 对 Unicode 字符进行分类,子类别用于精确定义类别。长名和简写的 Unicode 属性转义都可用. |
Script | 某字符用于多种文字时,Script 优先匹配最主要使用那个字符的文字。 |
Script_Extensions | 如果想要根据非主要的文字进行匹配,我们可以使用 Script_Extensions 属性 (简写为 Scx). |
UnicodeBinary 属性名 | 说明 |
---|---|
ASCII | ASCII 字符 |
Alpha | 具有字母顺序的字符 |
Emoji | Emoji 表情符 |
Hex_Digit | 16 进制数字 |
White_Space | 空白字符 |
下面是 ASCII 字符的简写形式
简写 | 全称 | 说明 |
---|---|---|
L | Letter | 字符 |
Lu | Uppercase Letter | 大写字符 |
Ll | Lowercase Letter | 小写字符 |
Lt | Titlecase Letter | 标题字符 |
Lm | Modifier Letter | 修饰符 |
Lo | Other Letter | 其他字符 |
M | Mark | 标记 |
Mn | Non-Spacing Mark | |
Mc | Spacing Combining Mark | |
Me | Enclosing Mark | |
N | Number | 数字 |
Nd | Decimal Digit Number | |
Nl | Letter Number | |
No | Other Number | |
S | Symbol | 符号 |
Sm | Math Symbol | 数学符号 |
Sc | Currency Symbol | |
Sk | Modifier Symbol | |
So | Other Symbol | |
P | Punctuation | 标点符号 |
Pc | Connector Punctuation | 下划线 |
Pd | Dash Punctuation | 破折号/减号 |
Ps | Open Punctuation | 左括号 ( , [ , { |
Pe | Close Punctuation | 右括号 ) , ] , } |
Pi | Initial Punctuation | |
Pf | Final Punctuation | |
Po | Other Punctuation | 不在上面几种标点内的其他标点 |
Z | Separator | 分隔符 |
Zs | Space Separator | 空白分隔符 |
Zl | Line Separator | 行分隔符 |
Zp | Paragraph Separator | 段落分隔符 |
C | Other | 其他 |
Cc | Control | 控制字符 |
Cf | Format | 格式字符 |
Cs | Surrogate | |
Co | Private Use | |
Cn | Unassigned |
因为可使用的属性和值太多,这里不一一赘述,仅提供几个例子。
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}
aεЛ何
匹配中文
\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}+
Приключения Алисы в Стране чудес
上面使用字符类和使用属性转义的结果是一样的,但使用属性转义可以让模式简洁的多。