正則表達式——Unicode 匹配規則

  通常來講,數字字符解釋[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 匹配規則編碼

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 字符,漢字全角字符一、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,由於這個版本使用很是少,並且有一些很是奇怪的表現。字符串

相關文章
相關標籤/搜索