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

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

因为包括了多种语言和字符,所以在 Unicode 编码中,全角数字0、1、2之类也算作“数字字符”,可以由\d匹配;中文字符,也可以算作“单词字符”,由\w匹配;同样的道理,中文的全角空格(码值为30 ff),也可以算作“空白字符”,由\s匹配。所以,如果在 Python 2 中指定了正则表达式使用 Unicode 模式(最简单的方式解释在正则表达式的开头指定模式修饰符(?u)),\d\w\s就能匹配全角数字、中文字符、全角空格。对于这种情况,本书中称为 Unicode 匹配规则;相应地,之前 ASCII 编码中的匹配,称为 ASCII 匹配规则

962172-20181213163301122-891340181.png

Unicode 模式下\d、\w、\s的匹配

简记法ASCII 匹配规则Unicode 匹配规则
\w[0-9a-zA-Z_][\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}\p{Nd}\p{Pc}]
\d[0-9][\p{Nd}]
\s\t,\n,\v,\f,\r,\x20[\f\n\r\t\v\x85\p{Z}]

注:\p{L}表示任意语言中的字母字符(包括英文字母和汉字);

\p{M}表示用来与其他字符结合的字符(声调、元音变化符等);

\p{Nd}表示任何书写系统中的 0~9 字符,汉字全角字符1、2等也算;

\p{N1}表示形如字符的数字,比如罗马数字;

\p{Pc}表示类似下划线之类的字符;

\p{InEnclosedAlphanumerics}表示被包围的数字或字符,比如①

\p{L}表示任意语言中的字母字符(包括英文字母和汉字);

有时候,这样的规定确实让人抓狂:假设你希望用正则表达式\d{6,12}来验证一个长度在 6 到 12 之间的数字字符串,却没有留意\d能匹配全角数字,验证就可能出错;所以,一定要注意此类问题。

常用语言中的匹配规则

语言字符组简记法的匹配规则
.NET默认采用 Unicode 匹配规则,但可以显示指定采用 ASCII 匹配规则
JavaASCII 匹配规则
JavascriptASCII 匹配规则
PHPASCII 匹配规则
Python 2默认采用 ASCII 匹配规则,但可以显示指定采用 Unicode 匹配规则
Python 3默认采用 Unicode 匹配规则,但可以显示指定采用 ASCII 匹配规则
Ruby 1.8默认采用 ASCII 匹配规则,显示指定 Unicode 模式之后,只有\w使用 Unicode 匹配规则
Ruby 1.9Unicode 匹配规则

注1:一般来说,单词边界\b能匹配的位置是:一端是单词字符,一端不是单词字符(也可以什么都没有),其中单词字符的规定与\w一样。Java 中则不是这样,它的细节比较复杂,以后再说。

注2:在Python 3 中可以在表达式最开始用(?a)指定 ASCII 模式。

注3:本书中说的 Ruby 1.9 指的是 Ruby 1.9.1 及以上版本,并不包含 Ruby 1.9.0,因为这个版本使用非常少,而且有一些非常奇怪的表现。

转载于:https://www.cnblogs.com/gaara0305/p/10114813.html