通常來講,數字字符解釋[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,由於這個版本使用很是少,並且有一些很是奇怪的表現。字符串