正则表达式与 Unicode 属性
在正则表达式中有以 \p{property}
方式表示的元字符序列,其含义是匹配特定 Unicode 属性的字符。在不同语言或工具中,语法和支持度均不尽相同,此处仅以 java 为例。
关于详细的 Unicode 的正则标准见该网站。
下述语法均基于 java8
Unicode属性
每个 Unicode 字符,除了有码点与其对应,还具有其他的属性。该处仅介绍 Category、Script、Block。
关于 Unicode 字符及属性可以用该网站查看。
关于 Unicode 字符属性的更详细介绍见该网站。
General Category
General Category 用于描述字符的功能,并不关心字符所属的语言,其共三十个类型(或二十九个,如果不认为 Cn 为一个字符分类)。
详细描述见该网站,此处仅列出所有类型并简单介绍其含义。
关于具体每种类型所包含字符见该网站。
值 | 描述 | 别名 | 示例或范围 |
---|---|---|---|
Lu | 大写字母 | Uppercase_Letter | a (U+0061) |
Ll | 小写字母 | Lowercase_Letter | A (U+0041) |
Lt | 前一部分大写的二合字母 | Titlecase_Letter | Lj (U+01C8) |
Lc | 区分大小写的字母 | Cased_Letter | Lu、Ll、Lt 的集合 |
Lm | 修饰符字母 | Modifier_Letter | ᵏ (U+1D4F) |
Lo | 其他字母,包含音节和表意文字 | Other_Letter | 我 (U+6211) |
L | 字母 | Letter | Lu、Ll、Lt、Lm、Lo 的集合 |
Mn | 非空白的组合标记(零步进宽度) | Nonspacing_Mark | ◌́ (U+0301) |
Mc | 空白的组合标记(正向步进宽度) | Spacing_Mark | ः (U+0903) |
Me | 封闭组合标记 | Enclosing_Mark | ҈ (U+0488) |
M | 标记 | Mark | Mn、Mc、Me的 集合 |
Nd | 十进制数字 | Decimal_Number | 0 (U+0030) |
Nl | 字母类数字 | Letter_Number | Ⅶ (U+2166) |
No | 其他数字 | Other_Number | ¼ (U+00BC) |
N | 数字 | Number | Nd、Ni、No 的集合 |
Pc | 连接标点 | Connector_Punctuation | _ (U+005F) |
Pd | 破折号或连字符标点 | Dash_Punctuation | - (U+002D) |
Ps | 成对标点的开启标点 | Open_Punctuation | ( (U+0028) |
Pe | 成对标点的关闭标点 | Close_Punctuation | ) (U+0029) |
Pi | 开始引号标点 | Initial_Punctuation | “ (U+201C) |
Pf | 结束引号标点 | Final_Punctuation | ” (U+201D) |
Po | 其他标点 | Other_Punctuation | |
P | 标点 | Punctuation | Pc、Pd、Ps、Pe、Pi、Pf、Po 的集合 |
Sm | 数学符号 | Math_Symbol | + (U+002B) |
Sc | 货币符号 | Currency_Symbol | $ (U+0024) |
Sk | 非字母修饰符号 | Modifier_Symbol | ^ (U+005E) |
So | 其他符号 | Other_Symbol | |
S | 符号 | Symbol | Sm、Sc、Sk、So 的集合 |
Zs | 空白分隔符字符(有不同的非零宽度) | Space_Separator | (U+0020) |
Zl | 行分隔符 | Line_Separator | (U+2028) |
Zp | 段落分隔符 | Paragraph_Separator | (U+0029) |
Z | 分隔符 | Separator | Zs、Zl、Zp 的集合 |
Cc | 控制字符 | Control | |
Cf | 格式控制字符 | Format | |
Cs | 代理代码点 | Surrogate | |
Co | 私有字符 | Private_Use | |
Cn | 保留码点或非字符 | Unassigned | |
C | 其他字符 | Other | Cc、Cf、Cs、Co、Cn 的集合 |
加粗的类别代表相关通用类别值的分组,这些类别只是为了方便希望实现匹配多个类型。
L& 是等价于 Lc 的一个描述,但在正则中通常使用后者。
Script
Script 是一个字母和其他书面符号的集合,通常具有以下属性:
- 具有共同的图形风格和历史
- 该集合被用来(全部或做为子集)代表一种或多种书写系统中的文本信息
一个字符只分配了一个 Script,因此即使该字符可能属于多个 Script,其属性值也只是他从属的主要的 Script。作为补充,另一个属性 Script_Extensions 属性则分配了一组 Script 值,为字符通用于多种 Script 提供了细节。
详细描述见该网站。
关于具体每种类型所包含字符见该网站。
Block
Unicode 将一组码点值连续的字符按照功能或用途等分割称为 Block。
正则表达式
可使用该网站在线编写并测试正则,不过该文用法属正则拓展,此网站不见得完全支持,推荐使用 idea 等工具的正则测试插件。
在 java 中匹配正则属性有两种语法,属性名=属性值
和 (无)\Is\In属性值
。Script 和 Block 的属性值是不区分大小写的。
源码在 Pattern 类的 family 方法中
匹配 Unicode 属性
//匹配Category
\p{gc=Lu}
\p{general_category=Lu}
\p{Lu}
\p{IsLu}
//匹配Script
\p{sc=Han}
\p{script=Han}
\p{IsHan}
//匹配Block 注意是In而不是Is
\p{blk=Basic_latin}
\p{block=Basic_latin}
\p{InBasic_latin}
在正则中可以使用三个不属于 General_Category 值的枚举范围的属性名,其介绍如下。
值\别名 | 描述 | 等价于 |
---|---|---|
Any | 所有码点 | [\u{0}-\u{10FFFF}] |
Assigned | 所有已分配的码点 | \P{Cn} |
ASCII | 所有 ASCII 字符 | [\u{0}-\u{7F}] |
其他
Java 中 \p 除了匹配正则属性外还有一些其他功能。
posix正则表达式与其Unicode兼容
Java 支持使用 posix 风格的表达式来匹配,同时可以开启 UNICODE_CHARACTER_CLASS
属性来使 posix 风格的表达式兼容 Unicode 字符。
//也许是为了实现考虑,语法和匹配Category的语法是一样的,不过出于语义考虑,只推荐用前两种
\p{Lower}
\p{IsLower}
\p{gc=Lower}
\p{general_category=Lower}
具体兼容规则见该网站;
匹配Character方法
Java 中同时支持匹配调用对应 Character 的中的方法的返回值为 true 的字符,支持的方法及语法如下。
方法 |
---|
isLowerCase |
isUpperCese |
isAlphabetic |
isIdeographic |
isTitleCase |
isDigit |
isDefined |
isLetter |
isLetterOrDigit |
isJavaIdentifierStart |
isJavaIdentifierPart |
isUnicodeIdentifierStart |
isUnicodeIdentifierPart |
isIdentifierIgnorable |
isSpaceChar |
isWhitespace |
isISOControl |
isMirrored |
使用时属性值为对应方法的方法名将 is 替换为 java 后的值。
//也许是为了实现考虑,语法也和匹配Category的语法是一样的,不过出于语义考虑,只推荐用前两种
\p{javaLowerCase}
\p{IsjavaLowerCase}
\p{gc=javaLowerCase}
\p{general_category=javaLowerCase}