每一个 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

正则表达式——Unicode 属性的更多相关文章

  1. 正则表达式——Unicode 属性列表

    7.7.1 Unicode Property   每个 Unicode 字符都只能属于一个 Unicode Property.所有的 Unicode Property 共分为7大类,30小类.大类的名 ...

  2. 正则表达式通过Unicode属性匹配

    原文链接:http://zochen.iteye.com/blog/690716 Unicode 编码并不只是为某个字符简单定义了一个编码,而且还将其进行了归类. \pP 其中的小写 p 是 prop ...

  3. 利用Unicode属性移除文本中的标点符号

    原文:http://bbs.csdn.net/topics/270033191   摘抄: str = str.replaceAll("[\\pP‘’“”]", "&qu ...

  4. 正则表达式pattern属性

    你发现自己多久匆匆编写一些正则表达式验证一个特定的文本. 多亏了新的pattern属性,我们可以在标签处直接插入一个正则表达式. <form action="" method ...

  5. 正则表达式——Unicode 匹配规则

      一般来说,数字字符解释[0-9],单词字符就是[0-9a-zA-Z_],空白字符则包括空格.回车等字符,但这是 ASCII 编码中的情况,在 Unicode 编码中并非如此.   因为包括了多种语 ...

  6. 正则表达式lastIndex属性浅析

    有这样一段代码: var newDateStr = " 11 13:48:18"; var reg = new RegExp("[0-9]+","g& ...

  7. 正则表达式——Unicode

    第 7 章 Unicode 7.1 关于编码   通常,英文编码较为统一,都采用ASCII编码或可以兼容ASCII编码(即编码表的前127位与ASCII编码一直,常见的各种编码,包括Unicode编码 ...

  8. 采用 Unicode 标点属性方式的正则表达式,可以去掉所有的标点符号,

    public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV去符 ...

  9. JavaScript学习笔记-正则表达式(RegExp对象)

    正则表达式(RegExp对象)   1.正则表达式字面量,在脚本加载后编译.若你的正则表达式是常量,使用这种方式可以获得更好的性能,重复使用时不会重新编译: 2.使用构造函数创建的RegExp,提供了 ...

随机推荐

  1. Librepilot-Spark2固件的烧写

    1.通过USB连接Librepilot_Spark2飞控,启动Librepilot GCS地面站(博主的GCS是16.09版本),界面如下. 2.点击Firmware标签页,点击终止系统(若板子未带系 ...

  2. ArrayList与LinkedList的区别

    两者区别大致分为以下几点: 1.ArrayList采用的是采用的是数组形式保存数据,这种方式将对象放在连续的位置中(线性存储):LinkedList采用的将对象放在独立的空间中,每个空间还保留下一个节 ...

  3. 调试dcc 试图将u-boot放入ocm运行碰到的问题

    1. 起因: gd->mon_len = (ulong)&__bss_end - (ulong)_start; 在u-boot.map中查找,发现__bss_end并不是u-boot.b ...

  4. Spring框架几种创建bean的方式

    Spring框架下,Bean的创建和装配非常的灵活,提供了三种主要的方式,并且相互见可以互相看见,也就是你可以随意地采用你喜欢且合适的方式创建Bean,而不用担心他们之间的兼容问题. 一.使用XML显 ...

  5. Error: unable to perform an operation on node 'rabbit@DESKTOP-6JT7D2H'. Please see diagnostics information and suggestions below.

    https://blog.csdn.net/qq_32814555/article/details/79494533

  6. java poi 操作

    Java POI 操作Excel(读取/写入) https://www.cnblogs.com/dzpykj/p/8417738.html Java操作Excel之Poi基本操作 https://my ...

  7. java常用类与包装类--常用类正则表达式 String正则方法+Matcher+Pattern

    0.java中的正则 java 中的正则总共涉及三个类(或者说1个String类和一个regex包) java.lang.String java.util. Matcher java.util.Pat ...

  8. hive中的null

    在处理流水增量表的时候,出现了一个判定的失误. select a.a1,a.a2 from ( select a.a1 ,,) as diff ,a.a2 from a lefter join b o ...

  9. centos6.5下修改系统的roo用户/非root用户的密码

    1.修改系统root用户的密码 [........~]# passwd然后输入新密码,若提示密码太简单,无需理会,直接敲回车: 然后再次输入新密码,即可修改成功. 2.修改系统非root用户的密码:e ...

  10. SpringBoot框架(6)--事件监听

    一.场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理. 二.事件监听步骤 (1)自定义事件继承ApplicationEvent抽象类 (2)自定义事件监听器,一般实现Ap ...