正規表達式這個東西可以稱得上是一門玄學,就算是你自己寫的表達式,過個幾天回來看依然是一臉懵逼,更不要說去看别人寫的表達式了。甚至國外有程式員說了這樣一句話:如果你有一個問題,并且你想到了用正規表達式來解決它,那麼你現在有兩個問題了。從這句話也不難看出,正規表達式還是很難的。那為什麼大家還要用它呢?因為它在文本處理方面的能力太過于強大了。總之呢,廣大程式員對它是又愛又恨。
0、引入
- 字母家族
中,在剛剛打字的過程中混進去了幾個壞人dongdongqiang
,現在我們需要幫助字母家族将壞人抓出來。但是我不是警察呀,我哪會破案。于是乎,我隻能請我們的大偵探正則兄來幫忙啦!正則兄一看,給了我兩件寶貝dong d0ong qiang
、\d
。我這趕緊就去找壞人了。\s
嘿嘿,找到一個,我說是誰呢,原來是數字小老弟哈。接下來我們再去試試另一件寶貝正規表達式之元字元0、引入1、元字元 搞定,竟然是一些占着茅坑不拉shi的空白字元。正規表達式之元字元0、引入1、元字元 - 破完案的感覺怎一個爽字了得,哈哈哈!!悄悄告訴你們,我剛剛從字母家族出來之後,撿到了一個包裹
,但是我區分不了它們是否值錢呀,哎!隻能舔着臉去找正則兄了。什麼,你說正則兄是偵探怎麼還能鑒寶了,對此,我隻能說,正則兄的強大不是我等能想象的。正則兄呢又給了我一件寶貝ascHJ#$%D4hu*(358Y___---=
,說它會告訴我哪些是價值連城的:\w
哈哈哈,竟然有這麼多寶貝,原來所有的字母數字下劃線都是價值連城的好寶貝呀!其它的想必也不會太差,我還是把它們全都放到我的倉庫裡吧!正規表達式之元字元0、引入1、元字元 - 最近手頭有點緊,想把之前撿到的寶貝拿出來賣了,但是倉庫好多東西呀!亂糟糟的,怎麼把上次撿到的東西全部拿出來呢?正在我一籌莫展的時候,正則兄出現了,得知我的困難後,他又給了我一件寶貝
,我趕緊拿着寶貝去找東西去了.
果然找到了,正則兄這次給的寶貝好像能找到任意的字元哦!!正規表達式之元字元0、引入1、元字元 - 某天,我獨自一人走在回家的小路上,突然,一個大大的問号出現在了我的腦海中:為什麼正則兄會有這麼多奇奇怪怪的寶貝???還總是有各種奇奇怪怪的人來找他,來的時候都愁眉苦臉,走的時候又蹦又跳,而且這些人還不止來一次。 想着想着我竟然來到正則兄的家門口,就在我猶豫要不要進去的時候,正則兄突然出來了,然後就把我叫進去了。進來之後我發現他的家裡也沒有特殊的,然後正則兄突然開口問我是不是有什麼問題?我也不知道該不該問,一直在支支吾吾的,正則兄可能是等得不耐煩了,想讓我先回去,就在正則兄準備起來給我開門的時候我一口氣把之前的疑問全都說出來了。然後正則兄就笑了,說這些都不是什麼寶貝,就是專門用來按一定的規則對字元串進行比對的,用它們組成的式子叫做正規表達式,然後還說:之前給我的都是一些基礎的元字元,除了前面提到的
、\d
、\s
、\w
,還有其它的,比如:.
、\D
、\W
等。它們的作用如下表:\S
符号 | 意義 |
---|---|
. | 表示任意字元 |
\d | 表示任意數字 |
\D | 表示任意非數字 |
\w | 表示任意字母數字下劃線 |
\W | 表示任意非字母數字下劃線 |
\s | 表示任意空白符 |
\S | 表示任意非空白符 |
除此之外,他還告訴我,這些元字元單獨使用并不能展現出正規表達式的強大之處,比如
\[email protected]\.com
就可以比對出QQ郵箱來(這個表達式還有很多缺陷,後面再來說)。這讓我覺得很神奇,就賴着他求他教我,最終他受不了我煩他,于是就答應我了。
1、元字元
除了之前說到的
\d
、
\D
、
\s
、
.
等這類表示單個特殊字元的元字元外,還有表示空白符、量詞、範圍的元字元。下面一個一個來說:
1. 空白符
在我們對文本進行處理的時候,總會遇到各種各樣的空白符,比如空格、換行、制表符等。雖然我們上面已經提到了一個可以比對任意空白符的
\s
。但是它的範圍太寬泛了,有的時候太寬泛并不是一件好事,是以正規表達式也提供了可以比對特定空白符的一些元字元:
符号 | 意義 |
---|---|
\r | 回車 |
\n | 換行 |
\f | 換頁 |
\v | 垂直制表符 |
\t | 制表符 |
還有一個比較常用的空白符:空格。除了可以用
\s
來比對,我們還可以就用空格來比對(英文模式下的空格)。
2. 量詞
上面說到的元字元都是隻能比對單個字元的,當我們需要比對同一類型的字元很多次的時候就會很麻煩,總不能要比對多少個就重複寫多少個上面的元字元吧!就算你不怕麻煩,就像這樣寫,那麼要是讓你比對“無數個”數字出來呢?你咋辦?是以量詞就很重要了。在正規表達式中有“量詞”功能的元字元有三個:
符号 | 意義 |
---|---|
* | 比對0次到多次 |
+ | 比對一次到多次 |
? | 比對0次或者1次 |
但是這三個元字元好像不夠用哈,比如我們要比對某個字元3次、至少3次、3次到5次怎麼辦呢?别急,正規表達式還有一種方式可以有量詞的作用:
符号 | 意義 |
---|---|
{m} | 比對m次 |
{m,} | 至少比對m次 |
{m,n} | 比對m次到n次 |
那量詞怎麼使用呢?上面提到的郵箱比對就是一種。再比如,我們要比對5個空格,
{5}
,前面有個空格哦!
3. 範圍
假如我們要比對滿足某個區間或者某個集合的資料,例如:比對出字元a或者b、比對出a-z等。怎麼做呢?在正則中中括号
[]
,就可以提供比對某個區間的功能,中括号和豎線就可以比對出或者的功能。
符号 | 意義 |
---|---|
| | 或者 |
[…] | 裡面任意一個 |
比如上面說的例子:a或者b的表達式就是
a|b
,或者
[ab]
,比對a-z的表達式就是
[a-z]
。還有一個符号
^
,也可以配合中括号來使用,例如:
[^...]
,可以比對除了出現在中括号裡面的任何字元,這個
^
在這就是取反的意思。
到這,元字元的知識就結束了。
最後我們再來完善一下前面提到的比對qq郵箱的表達式:
對于qq郵箱有什麼規則呢?
- 字首由數字或者字母組成
- 長度也是有限制的,這裡假如是5到11位
那麼根據這兩條規則怎麼來寫呢?
[a-zA-Z0-9|\d]{5,11}@qq\.com
點前面的\是轉義的意思。