正则表达式与Unicode属性

正则表达式与 Unicode 属性

​ 在正则表达式中有以 \p{property} 方式表示的元字符序列,其含义是匹配特定 Unicode 属性的字符。在不同语言或工具中,语法和支持度均不尽相同,此处仅以 java 为例。

​ 关于详细的 Unicode 的正则标准见该网站

下述语法均基于 java8

Unicode属性

​ 每个 Unicode 字符,除了有码点与其对应,还具有其他的属性。该处仅介绍 Category、Script、Block。

​ 关于 Unicode 字符及属性可以用该网站查看。

​ 关于 Unicode 字符属性的更详细介绍见该网站

General Category

​ General Category 用于描述字符的功能,并不关心字符所属的语言,其共三十个类型(或二十九个,如果不认为 Cn 为一个字符分类)。

​ 详细描述见该网站,此处仅列出所有类型并简单介绍其含义。

​ 关于具体每种类型所包含字符见该网站

描述别名示例或范围
Lu大写字母Uppercase_Lettera (U+0061)
Ll小写字母Lowercase_LetterA (U+0041)
Lt前一部分大写的二合字母Titlecase_LetterLj (U+01C8)
Lc区分大小写的字母Cased_LetterLu、Ll、Lt 的集合
Lm修饰符字母Modifier_Letterᵏ (U+1D4F)
Lo其他字母,包含音节和表意文字Other_Letter我 (U+6211)
L字母LetterLu、Ll、Lt、Lm、Lo 的集合
Mn非空白的组合标记(零步进宽度)Nonspacing_Mark◌́ (U+0301)
Mc空白的组合标记(正向步进宽度)Spacing_Markः (U+0903)
Me封闭组合标记Enclosing_Mark҈ (U+0488)
M标记MarkMn、Mc、Me的 集合
Nd十进制数字Decimal_Number0 (U+0030)
Nl字母类数字Letter_NumberⅦ (U+2166)
No其他数字Other_Number¼ (U+00BC)
N数字NumberNd、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标点PunctuationPc、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符号SymbolSm、Sc、Sk、So 的集合
Zs空白分隔符字符(有不同的非零宽度)Space_Separator(U+0020)
Zl行分隔符Line_Separator(U+2028)
Zp段落分隔符Paragraph_Separator(U+0029)
Z分隔符SeparatorZs、Zl、Zp 的集合
Cc控制字符Control
Cf格式控制字符Format
Cs代理代码点Surrogate
Co私有字符Private_Use
Cn保留码点或非字符Unassigned
C其他字符OtherCc、Cf、Cs、Co、Cn 的集合

​ 加粗的类别代表相关通用类别值的分组,这些类别只是为了方便希望实现匹配多个类型。

​ L& 是等价于 Lc 的一个描述,但在正则中通常使用后者。

Script

​ Script 是一个字母和其他书面符号的集合,通常具有以下属性:

  1. 具有共同的图形风格和历史
  2. 该集合被用来(全部或做为子集)代表一种或多种书写系统中的文本信息

​ 一个字符只分配了一个 Script,因此即使该字符可能属于多个 Script,其属性值也只是他从属的主要的 Script。作为补充,另一个属性 Script_Extensions 属性则分配了一组 Script 值,为字符通用于多种 Script 提供了细节。

​ 详细描述见该网站

​ 关于具体每种类型所包含字符见该网站

Block

​ Unicode 将一组码点值连续的字符按照功能或用途等分割称为 Block。

​ 关于 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}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值