正则表达式——Unicode 属性

  每一个 Unicode 字符,除了有 Code Point 与之对应外,还具体其他属性,在正则表达式中常用到三种 Unicode 属性: Unicode Property、Unicode Script,分别对应字符符的功能、所属代码区段、书写系统;它们的表现形式都类似\p{property}

7.6.1 Unicode Property

  Unicode Property 的记法类似\p{L}\p{P}。它按照字符的功能分类 Unicode 字符,每个 Unicode 字符只能属于一个Unicode Property。

  可以这样理解 Unicode Property:它并不关心字符所属的语言,只关心字符的功能,比如\p{Z}表示任意的空白字符或不可见的分隔符;\p{P}表示任意标点字符,等等。遇到中英文混排、全角、半角字符同时出现的情况,看可以用\p{Z}匹配所有的空白字符(而不用关心空格到底是全角空格还是半角空格),用\p{P}匹配所有的标点字符(而不用关心逗号到底是中文逗号还是英文逗号)。

  如果把 Unicode Property 理解为一个“字符组”,name一定还有对应的排除型字符组,此排除型字符组的通行记法是将\p{property}中的小写改为大写P,写作\P{property}。这样,Script 对应的排除型字符组也是这样标记。

  支持 Unicode Propery 的语言有.NET、Java、PHP和Ruby(限1.9以上版本),在PHP和Ruby中使用 Unicode Property 时,必须要开启 Unicode 模式。

.NET
Regex.IsMatch(",", "\\p{P}");      // => True

Java
",".matches("\\p{P}");             // => True

PHP
preg_match("/\\p{P}/u", ",");      // => 1

Ruby 1.9
/\p{P}/n =~ ","                    # => 0

7.6.2 Unicode block

  不同于 Unicoe Property,它按照编码区间划分 Unicode 字符,各个区间彼此联系但互不相交,所以每个 Unicode 编码中的每个字符都有唯一归属的 Unicode Block。

  在 Unicode 编码表中,同一种语言的字符通常落在同一区间的,所以 Unicode Block 也可以粗略表示某类语言的字符,比如\p{InHebrew}表示希伯莱语字符,\p{InCJK_Unified_Ideographs}表示兼容 CJK(中文、日文、韩文)统一表意字符。如果细心阅读文档,会发现 Unicode Block 的名字虽然类似某种语言的名字,但都有 In(Java风格)或者 Is(.NET风格)前缀,所以它对应的还是“落在某个区间的 Unicode 字符”。

  在本书介绍的语言中,只有 Java 和 .NET 支持 Unicode Block,但是记法不相同,下面以 CJK 统一表意字符为例,虽然记法不同,但功能呢是相同的,都可以匹配任意一个中文字符。

Java
"我".matches("\\p{InCJK_Unified_Ideographs}");             // => True

.NET
Regex.IsMatch("我", "\\p{InCJKUnifiedIdeographs}");        // => True

  另外值得一用的是\p{InCJK_Symbols_and_Punctuation},从命名上来看,它覆盖了中文、日文、韩文中的大部分常见标点,但事实并非如此,比如全角逗号,就不在这个 Block 中。不过,所有标点都在\p{P}这个 Unicode Property 中。

  全角逗号不属于\p{InCJK_Symbols_and_Punctuation}

"。".matches("\\p{InCJK_Symbols_and_Punctuation}"); // => True
",".matches("\\p{InCJK_Symbols_and_Punctuation}"); // => False
"。".matches("\\p{P}");                             // => True
",".matches("\\p{P}");                             // => True

7.6.3 Unicode Script

  Unicode Script 按照字符所属的书写系统来划分 Unicode 字符,比如\p{Greek}表示希腊语字符,\p{Han}表示汉语(中文字符)。它的写法类似 Unicode Block,只是名字的开头没有 Is 或者 In。

  在本书介绍的语言中,只有 PHP 和 Ruby(限1.9以上版本)支持 Unicode Script,PHP在使用 Unicode Script 时,必须开启 Unicode 模式。在这两种语言中,我们可以很方便地用\p{Han}来匹配中文字符。

PHP
preg_match("\\p{Han}/u", "我");     // => 1
Ruby 1.9
/\p{Han}/u =~ "我"                  # => 0
posted @ 2018-12-14 11:58  gaara724  阅读(1569)  评论(1编辑  收藏  举报