通常来讲,数字字符解释[0-9]
,单词字符就是[0-9a-zA-Z_]
,空白字符则包括空格、回车等字符,但这是 ASCII 编码中的状况,在 Unicode 编码中并不是如此。正则表达式
由于包括了多种语言和字符,因此在 Unicode 编码中,全角数字0、一、2之类也算做“数字字符”,能够由\d
匹配;中文字符,也能够算做“单词字符”,由\w
匹配;一样的道理,中文的全角空格(码值为30 ff),也能够算做“空白字符”,由\s
匹配。因此,若是在 Python 2 中指定了正则表达式使用 Unicode 模式(最简单的方式解释在正则表达式的开头指定模式修饰符(?u)
),\d
,\w
,\s
就能匹配全角数字、中文字符、全角空格。对于这种状况,本书中称为 Unicode 匹配规则;相应地,以前 ASCII 编码中的匹配,称为 ASCII 匹配规则。编码
简记法 | 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 字符,汉字全角字符一、2等也算;
\p{N1}表示形如字符的数字,好比罗马数字;
\p{Pc}表示相似下划线之类的字符;
\p{InEnclosedAlphanumerics}表示被包围的数字或字符,好比①;
\p{L}表示任意语言中的字母字符(包括英文字母和汉字);
code
有时候,这样的规定确实让人抓狂:假设你但愿用正则表达式\d{6,12}
来验证一个长度在 6 到 12 之间的数字字符串,却没有留意\d
能匹配全角数字,验证就可能出错;因此,必定要注意此类问题。blog
语言 | 字符组简记法的匹配规则 |
---|---|
.NET | 默认采用 Unicode 匹配规则,但能够显示指定采用 ASCII 匹配规则 |
Java | ASCII 匹配规则 |
Javascript | ASCII 匹配规则 |
PHP | ASCII 匹配规则 |
Python 2 | 默认采用 ASCII 匹配规则,但能够显示指定采用 Unicode 匹配规则 |
Python 3 | 默认采用 Unicode 匹配规则,但能够显示指定采用 ASCII 匹配规则 |
Ruby 1.8 | 默认采用 ASCII 匹配规则,显示指定 Unicode 模式以后,只有\w使用 Unicode 匹配规则 |
Ruby 1.9 | Unicode 匹配规则 |
注1:通常来讲,单词边界\b能匹配的位置是:一端是单词字符,一端不是单词字符(也能够什么都没有),其中单词字符的规定与\w同样。Java 中则不是这样,它的细节比较复杂,之后再说。ip
注2:在Python 3 中能够在表达式最开始用(?a)指定 ASCII 模式。unicode
注3:本书中说的 Ruby 1.9 指的是 Ruby 1.9.1 及以上版本,并不包含 Ruby 1.9.0,由于这个版本使用很是少,并且有一些很是奇怪的表现。字符串