
第一次接觸正則表達(dá)式是在今年四月的騰訊筆試,當(dāng)時(shí)是一道選擇題問如何判斷輸入的是否是 QQ 號碼(即純數(shù)字),當(dāng)時(shí)是蒙了一個(gè)答案,菜鳥不會嘛 ╮(╯3╰)╭ 沽翔。事后自己倒專門學(xué)習(xí)了正則表達(dá)式鲜漩,還做了筆記,可是平時(shí)開發(fā)倒的確是用得少诅诱,最近倒也忘了,近來又是校招的季節(jié)送朱,自己就重新整理一篇簡要入門娘荡,分享給大家的同時(shí),自己也復(fù)習(xí)復(fù)習(xí)骤菠。
資源推薦
- 《正則表達(dá)式30分鐘入門教程》 :請忽略這個(gè)「30分鐘」它改,哥反正到頭來還是得不斷查表。
- "Regular Expressions: Up and Running"" : 這個(gè)是 tutsplus 的正則表達(dá)式付費(fèi)教程商乎,由淺入深央拖,很不錯(cuò)○钠荩咳咳鲜戒,當(dāng)年哥付費(fèi)搞過一個(gè)月會員,至于這個(gè)百度盤里是什么視頻嘛抹凳,咳咳遏餐,我神馬都不知道。
- 《正則表達(dá)式語言 - 快速參考》 : 微軟 MSDN 的手冊赢底,適合參考失都。
- 《正則表達(dá)式教程》 參考文檔柏蘑,推薦。
什么是正則表達(dá)式
正則表達(dá)式(Regular Expression粹庞,一般簡寫為RegEx或者RegExp)咳焚,也譯為正規(guī)表示法、常規(guī)表示法庞溜,在計(jì)算機(jī)科學(xué)中革半,是指一個(gè)用來描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。from 知乎
上面那段文字是不是有點(diǎn)難理解流码,那我們就用淺顯易懂的語言來解釋一下又官。正則表達(dá)式嘛,我們平時(shí)在日常的開發(fā)中漫试,有時(shí)候經(jīng)常要有一些匹配需求六敬,比如說:
- linux 用戶經(jīng)常要用到的
rm *.png
命令就是刪除當(dāng)前目錄下的所有png 格式的圖片。 - 判斷用戶輸入的 id 和密碼是否符合要求(不要亂輸入奇怪符號)商虐,
- 請輸入你的郵箱觉阅、手機(jī)號碼balabala
- 寫了一個(gè)爬蟲崖疤,抓取網(wǎng)頁上的獲得的數(shù)據(jù)秘车,只需要某個(gè)列表里的一大串html 代碼中某個(gè)表單 tr 里的某個(gè) class 為 apple 的內(nèi)容。
- 做報(bào)表和數(shù)據(jù)劫哼,一堆高端大氣上檔次亮瞎的數(shù)據(jù)呀叮趴,比如說要把2013-9-17統(tǒng)一替換成「13年9月17日」,咳咳权烧,word 能解決么眯亦?反正正則是可以解決的。
總的來說般码,歸根到底妻率,正則表達(dá)式可以解決「查找&替換」兩大需求,當(dāng)然啦板祝,根據(jù)目前我的體驗(yàn)宫静,這個(gè)需求平時(shí)還是不常用的,但不管咋樣券时,還是有用的孤里。
正則表達(dá)式,就是利用不同的字符橘洞,由于不同的字符代表不同的含義捌袜,可以來不斷精確定位我們的數(shù)據(jù)范圍,然后進(jìn)一步進(jìn)行操作和替換炸枣。
進(jìn)擊之正則虏等!
學(xué)習(xí)正則弄唧,我們從最常見的字符開始。上面已經(jīng)提到*
號霍衫,是一個(gè)通配符套才,*
星號所代表的就是任意的字符。比如說慕淡,我們可以使用rm *
來刪除文件夾中的所有文件旧乞。
杠杠的斜杠\
轉(zhuǎn)義字符
在正則匹配中,我們經(jīng)辰鞒可以見到反斜杠\
完沪,在正則表達(dá)式中,這是轉(zhuǎn)義符携兵,一般用在兩種情況:
- 一種
\
符號后面跟了一個(gè)特殊的字符疾掰,指代不同類型的字符。如\d
指的就是與任何十進(jìn)制數(shù)字匹配徐紧。 - 另外一種情況静檬,則是指示某些特殊符號就是原來的特殊符號,比如說我們上面所有的
*
號代表所有的意思并级,可是如果我們要尋找就就是*
這個(gè)符號本身拂檩,那我們就可以通過\*
來找到,同樣的嘲碧,通過\\
我們可以匹配字符\
本身稻励。
比如說我們luolei\.org
匹配的是 luolei.org ,C:\\windows
匹配的是 C:\windows
元字符
元字符是正則表達(dá)式的關(guān)鍵愈涩,常用的元字符可以參考附錄【所有元字符】一表望抽。
最常見的比如
. 匹配除了換行符(\n)之外的任意字符
\d 匹配一個(gè)數(shù)字字符,等價(jià)于[0-9]
\w 匹配字母或者數(shù)字或者下劃線或者漢字
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
反義
上面我們提到了常見的元字符履婉,可是有時(shí)候我們偏偏要找的就不是他們煤篙,那么此時(shí)我們就可以用到反義。
\D 匹配任意非數(shù)字的字符
\W 匹配任意不是字母毁腿,數(shù)字辑奈,下劃線,漢字的字符
\B 匹配不是單詞開頭或結(jié)束的位置
[^x] 匹配除了x以外的任意字符
回到現(xiàn)實(shí)狸棍,我們來點(diǎn)實(shí)際的身害,比如說,我們要在下面這段數(shù)據(jù)中抓取出妹紙們的QQ號
妹紙們的聯(lián)系方式(絕密2莞辍)
白富美QQ:52012345
白白美qq:520696969
搗亂的白富美QQ:520
搗亂的白富美QQ:1234567890123456
富白美QQ:abc1234
美白富PP:51696969
由常識可知塌鸯,扣扣號一般都是 5-12位的,那我們可以看出只需要匹配符合 兩個(gè)條件1.是QQ號不是PP 號 2.是符合5-12位的數(shù)字唐片,
此時(shí)丙猬,我們試一試使用正則表達(dá)式QQ:\d{5,12}$
涨颜,喲,匹配了茧球,這里的{5,12}
庭瑰,是正則表達(dá)式的限定符,表示重復(fù)的次數(shù)不少于5次抢埋,不多于12次弹灭,這里我們怎么理解呢?

QQ:
表示的是我們在數(shù)據(jù)中尋找符合QQ:
的字段揪垄,找到了白富美穷吮、搗亂的白富美、富白美三都留了 QQ饥努,接著我們要匹配的是數(shù)字\d
捡鱼,所以富白美開頭是字母 abc 就排除了,我們還剩下兩個(gè)白富美酷愧,接著我們開始尋找接下來重復(fù)了超過5次數(shù)字驾诈、但是又不超過12次數(shù)字的數(shù)據(jù),而$
則意味著必須匹配到結(jié)尾溶浴。常用的限定符有:
* 重復(fù)0次或者更多次
+ 重復(fù)1次或更多次
? 重復(fù)0次或者1次(可以理解為存在或者不存在)
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次
file:///Users/luolei/Desktop/regual-2.png
如我們使用^\w+
可以匹配hello_123 world luolei
中的hello_123
(或者字符串中第一個(gè)連續(xù)字段)乍迄,意思就是從^
字符開頭開始匹配\w
字母數(shù)字下劃線,直到空格停止戳葵。
字符組[ ]
上面我們學(xué)習(xí)了一些基本的元字符就乓,也學(xué)習(xí)了限定符,接下來我們來學(xué)習(xí)一下字符類拱烁,比如說,我是一個(gè)腦殘迷信粉噩翠,我喜歡的妹紙的 QQ 號碼里不能有數(shù)字4戏自。這時(shí)候我們該怎么選呢?這個(gè)時(shí)候我們就要用到字符類方括號[ ]
伤锚,比如說[123567890]
就是匹配不包含4的字符擅笔。
比如說QQ:\d[123567890]+$
就是匹配不包含數(shù)字4妹紙的QQ。至于這段正則的含義屯援,想必你定能悟出猛们,有了前面的基礎(chǔ),只要你能理解這段正則中+$
的含義就好狞洋。(注意:同樣的弯淘,利用反義,我們可以通過QQ:\d[^4]{5,12}$
實(shí)現(xiàn)一樣的效果)吉懊。

#######分組( )
和分支|
這時(shí)候庐橙,有有一個(gè)妹紙留了一個(gè) QQ 號假勿,可是沒想到她寫的是小寫的 qq 而不是大寫的QQ,那么此時(shí)此刻态鳖,我們該怎么辦呢转培,意思是一樣的,都是扣扣浆竭,萬一錯(cuò)過了怎么辦浸须,此時(shí),我們就要用到了正則表達(dá)式的分組( )
和分支|
功能邦泄,有點(diǎn)編程基礎(chǔ)的朋友知道|
一般就是或者的意思羽戒,如在 javascript 中||
就是或者的意思。
if(6>5||3>5){
console.log('算你成功吧');
}
//雖說3>5是 false虎韵,可是6>5是 ture易稠,所以依舊成功提示。
在正則中包蓝,我們也可以用|
符號把不同的規(guī)則分隔開驶社。比如說這里我們就能通過(QQ|qq):
同時(shí)獲取QQ:
和qq:
, 終于要到了妹紙的扣扣测萎,這下該要電話號碼了亡电,號碼有好多種呢,格式也不一樣硅瞧,以白富美為例
妹紙的電話(絕密7萜埂)
白富美聯(lián)通:086-18688812345
白富美移動:15013151234
白富美座機(jī):0755-26480888
白富美帝都:(010)12345678
白富美公司:010-88812345
我們可以看到,白富美電話眾多腕唧,有手機(jī)有座機(jī)或辖,現(xiàn)在比如說我們要拿白富美妹紙的所有座機(jī)號,這下蛋疼了枣接,即有4位區(qū)號的颂暇,又有3位區(qū)號的,然后還有不同的格式但惶,咳咳耳鸯,正則在手,妹紙俺有膀曾,慢慢來县爬。
我們觀察到,有些區(qū)號是諸如(010)
用(
開頭添谊,那么我們就做一個(gè)判斷\(?
财喳,開頭的數(shù)字的是一個(gè)0那我們就先來個(gè)0
,可是我們后面的區(qū)號就是2個(gè)數(shù)字或者3個(gè)數(shù)碉钠,此時(shí)我們就用到分支和分組纲缓,(\d{2}|\d{3})
接下來就用)
右括弧又有-
橫桿卷拘,由于是特殊符號,我們想起了前面提到過的[]
字符組方括號祝高,來搞一個(gè)[(-]?
栗弟,接下來我們知道妹紙的座機(jī)是7位?或者8位的,那就再添加一個(gè)(\d{7}|\d{8})
工闺,還有一個(gè)別忘了乍赫,記得匹配到結(jié)尾哦,添加一個(gè)$
,最后我們結(jié)合起來就是\(?0(\d{2}|\d{3})[)-]?(\d{8}|\d{7})$
陆蟆,

看看是不是很神奇雷厂,就這么把妹紙的座機(jī)號碼給抓到了。
進(jìn)階
今天這篇分享給大家的博文叠殷,主要還是為了自己復(fù)習(xí)改鲫,正則表達(dá)式還有許多高級用法,鑒于博主水平和時(shí)間林束,在這里就不班門弄斧誤導(dǎo)各位了像棘,主要還是介紹這么一個(gè)東西給大家,讓大家平時(shí)在工作壶冒、學(xué)習(xí)中遇到某些問題的時(shí)候缕题,能夠有思路怎么解決,當(dāng)然胖腾,如果你真的能掌握得爐火純青烟零,那依舊要佩服佩服,至于到時(shí)候真的需要解決復(fù)雜的解決需求嘛咸作,我的建議還是1.分析字符數(shù)據(jù)結(jié)構(gòu) 2.查找(文檔) 3.嘗試锨阿。
在這里再推薦一篇從開發(fā)實(shí)例解析的正則教程《跟我學(xué)正則表達(dá)式》,比如說反向引用那篇就很實(shí)用性宏。