正则表达式——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
正则表达式——Unicode 属性的更多相关文章
- 正则表达式——Unicode 属性列表
7.7.1 Unicode Property 每个 Unicode 字符都只能属于一个 Unicode Property.所有的 Unicode Property 共分为7大类,30小类.大类的名 ...
- 正则表达式通过Unicode属性匹配
原文链接:http://zochen.iteye.com/blog/690716 Unicode 编码并不只是为某个字符简单定义了一个编码,而且还将其进行了归类. \pP 其中的小写 p 是 prop ...
- 利用Unicode属性移除文本中的标点符号
原文:http://bbs.csdn.net/topics/270033191 摘抄: str = str.replaceAll("[\\pP‘’“”]", "&qu ...
- 正则表达式pattern属性
你发现自己多久匆匆编写一些正则表达式验证一个特定的文本. 多亏了新的pattern属性,我们可以在标签处直接插入一个正则表达式. <form action="" method ...
- 正则表达式——Unicode 匹配规则
一般来说,数字字符解释[0-9],单词字符就是[0-9a-zA-Z_],空白字符则包括空格.回车等字符,但这是 ASCII 编码中的情况,在 Unicode 编码中并非如此. 因为包括了多种语 ...
- 正则表达式lastIndex属性浅析
有这样一段代码: var newDateStr = " 11 13:48:18"; var reg = new RegExp("[0-9]+","g& ...
- 正则表达式——Unicode
第 7 章 Unicode 7.1 关于编码 通常,英文编码较为统一,都采用ASCII编码或可以兼容ASCII编码(即编码表的前127位与ASCII编码一直,常见的各种编码,包括Unicode编码 ...
- 采用 Unicode 标点属性方式的正则表达式,可以去掉所有的标点符号,
public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV去符 ...
- JavaScript学习笔记-正则表达式(RegExp对象)
正则表达式(RegExp对象) 1.正则表达式字面量,在脚本加载后编译.若你的正则表达式是常量,使用这种方式可以获得更好的性能,重复使用时不会重新编译: 2.使用构造函数创建的RegExp,提供了 ...
随机推荐
- Librepilot-Spark2固件的烧写
1.通过USB连接Librepilot_Spark2飞控,启动Librepilot GCS地面站(博主的GCS是16.09版本),界面如下. 2.点击Firmware标签页,点击终止系统(若板子未带系 ...
- ArrayList与LinkedList的区别
两者区别大致分为以下几点: 1.ArrayList采用的是采用的是数组形式保存数据,这种方式将对象放在连续的位置中(线性存储):LinkedList采用的将对象放在独立的空间中,每个空间还保留下一个节 ...
- 调试dcc 试图将u-boot放入ocm运行碰到的问题
1. 起因: gd->mon_len = (ulong)&__bss_end - (ulong)_start; 在u-boot.map中查找,发现__bss_end并不是u-boot.b ...
- Spring框架几种创建bean的方式
Spring框架下,Bean的创建和装配非常的灵活,提供了三种主要的方式,并且相互见可以互相看见,也就是你可以随意地采用你喜欢且合适的方式创建Bean,而不用担心他们之间的兼容问题. 一.使用XML显 ...
- 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
- java poi 操作
Java POI 操作Excel(读取/写入) https://www.cnblogs.com/dzpykj/p/8417738.html Java操作Excel之Poi基本操作 https://my ...
- java常用类与包装类--常用类正则表达式 String正则方法+Matcher+Pattern
0.java中的正则 java 中的正则总共涉及三个类(或者说1个String类和一个regex包) java.lang.String java.util. Matcher java.util.Pat ...
- hive中的null
在处理流水增量表的时候,出现了一个判定的失误. select a.a1,a.a2 from ( select a.a1 ,,) as diff ,a.a2 from a lefter join b o ...
- centos6.5下修改系统的roo用户/非root用户的密码
1.修改系统root用户的密码 [........~]# passwd然后输入新密码,若提示密码太简单,无需理会,直接敲回车: 然后再次输入新密码,即可修改成功. 2.修改系统非root用户的密码:e ...
- SpringBoot框架(6)--事件监听
一.场景:类与类之间的消息通信,例如创建一个对象前后做拦截,日志等等相应的事件处理. 二.事件监听步骤 (1)自定义事件继承ApplicationEvent抽象类 (2)自定义事件监听器,一般实现Ap ...