每一个 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. java面试(集合类)03

    1.Collection 和 Collections 有什么区别? Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List.Set 等 ...

  2. Tensorrt之tf-trt

    使用python接口, 另外一种方式就是使用tf-trt,优化后的模型还是pb.优化的过程主要是一些层的合并啊之类的,加速结果不是特别明显,测了两个网络, 加速了10%的样子.优化后仍是pb,因此可以 ...

  3. dedecms织梦无法保存栏目内容的解决方法

    最近使用DedeCms5.3和DedeCms5.5遇到了一个不可思议的问题:在添加栏目时IE内核的浏览器无法保存栏目内容.到网上搜索了半天没找到解决方法,查看DedeCms官方搜索到的结果是“栏目内容 ...

  4. Codeforces 898 贪心关闭最少闹钟 优先队列最少操作构造N/2squares 讨论情况哈希数字串分割a+b=c

    A /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) ...

  5. linux shell getopt

    linux shell命令行选项与参数用法详解--getopts.getopt https://www.jianshu.com/p/6393259f0a13

  6. 【leetcode&CN&竞赛】1198.Find Smallest Common Element in All Rows

    题目如下: 给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [ ...

  7. 【ipc-mq】根据mq的key查看使用进程

    使用ipcs -q可以得到key与msqid的对应关系,从而找到msgid webadmin@172.172.179.3:/usr/local/webapps/test_ma[17:17:36]$ i ...

  8. linux-ntp-10

    Unix/linux类:ntp.aliyun.com,ntp1-7.aliyun.com windows类: time.pool.aliyun.com s1a.time.edu.cn 北京邮电大学 s ...

  9. BZOJ 3197: [Sdoi2013]assassin 树形DP + 最小费用流 + 树的同构

    Description Input Output 其实就是给出两颗树,求一种两种树同构的方式,使得不同颜色个数最少$.$树的重新构建,其实就是指定不同的点为根节点$.$ 好在树的重心有一个重要的性质: ...

  10. android出现backtrace 定位方法