本文的目的不只是教會讀者怎麼使用正則表達式。更但願經過學習正則表達式的案例,讓讀者感覺一種不一樣的思惟方式。魚亦漁亦水,誰知道呢,我在扯淡,你要不要看?正則表達式
正則表達式是描述一組字符串特徵的模式,用來匹配特定的字符串。--Ken Thompson架構
這句話中提到了兩點:學習
匹配特定字符串就是正則表達式要解決的問題域。
怎麼解決的呢?經過描述一組字符串特徵的方式來匹配。spa
舉個例子:code
www.ly.com
咱們一般是這樣去描述的:3w.ly.com
這裏咱們把連續的多個w,用位數簡述了(對應位區間的概念,後面會詳細講解)。這就是正則表達式解決問題的思路。blog
正則表達式:字符串
w{3}.ly.com
再好比,怎麼描述一個正整數呢?
首位是1-9的數字,其他位爲0到9。其他位位數是0到無窮。
這裏咱們把首位字符的可能性羅列了出來。把其他位位數用一個可能性區間描述。string
正則表達式:class
[1-9][0-9]{0,}
至此,咱們感性認識了正則表達式。下面將正式帶領你們認識這個「描述字符串特徵的模式」。object
什麼是字符串呢?一串字符唄。本着化繁爲簡的常規架構手法(分而治之),能夠想到描述一組字符串特徵的問題,能夠拆解爲:
好比,上面正整數的例子[1-9]描述了字符特徵,{0,}描述了0到無窮的一個位區間。
這裏咱們須要聲明或重申幾個概念:
咱們使用[ ]表示。以下:
[Aa]:描述一個字符多是A或a中的一個。
A=[A]
當描述的字符取值只有一種可能時,咱們一般用字面量A代替。
[1-5]=[1,2,3,4,5]
當描述的字符取值的可能性是連續時,咱們一般用-簡寫。
邏輯符號
|
邏輯「或」
^
邏輯「取反」
抽象
\d=[0123456789]
\w=[A-Za-z0-9_]
\s=[ \f\n\r\t\v]
\D=^\d \W=^\w \S=^\s
.
正則中的object
咱們使用{}標識。以下:
{3,5}:描述3到5位。
{2,}:描述2到無窮位。
{0,3}:描述0到3位。
簡寫
邊界符不描述字符,而是描述字符串中的位置。
分組符是解決另外一個問題。在咱們選擇出某個字符串後,咱們在替換結果裏使用其中的一部分(子模式)。
咱們把這種,先選擇後使用的過程叫作後引用。
其中分組符,就是用來解決子模式切割的。
替換時,$0:是匹配的整個字符串。
$1:是捕獲的第一個子模式(從前到後遇到的第一個捕獲分組起始符)
依次類推,$n:是捕獲的第n個子模式。
下面給三個例子:
例1:
例2:
例3:
\
怎麼描述被正則表達式佔用的關鍵字符呢?
轉義。
例如:\.描述.
關注公衆號「架構思惟修煉」,輸入關鍵字「正則表達式圖解」,獲取高清腦圖。