10分鐘搞定正則表達(dá)式

學(xué)習(xí)資料:《正則表達(dá)式必知必會(huì)》人民郵電出版社
正則表達(dá)式測(cè)試工具:http://regexr.com/

1.匹配單個(gè)字符

1.1匹配純文本

格式

text

說明:匹配text文本
例子

1.2匹配任意字符

格式

.

說明:如果想匹配任意一個(gè)字符,可將這個(gè)字符的位置用.代替,比如想匹配cat或cot,即中間的字符可能是a也可能是o,那么就正則式就可以這么寫:c.t
例子

1.3匹配特殊字符

格式

\字符

說明:拿上面的例子來說,有時(shí)候我們只想匹配.這個(gè)字符,而如果直接寫.的話就會(huì)匹配一個(gè)任意字符,所以針對(duì)這種情況,可以使用轉(zhuǎn)義字符\表明后面的字符有特殊含義,而不是字符本身的含義。比如上一個(gè)例子,如果只想匹配一個(gè).,那可以寫成\.
例子

2.匹配一組字符

2.1匹配多個(gè)字符中的某一個(gè)

格式

[字符集合]

說明:拿之前cat和cot的例子來說,如果用c.t,那么同時(shí)會(huì)匹配到crt、cct這些字符,因?yàn)橹虚g那個(gè)字符是任意的,而如果我們只想匹配cat和cot這兩個(gè)文本,那么就可以使用[],在方括號(hào)里定義可能出現(xiàn)的字符集合,這樣在匹配時(shí),只要字符是在這個(gè)帶匹配的字符集合里的都能匹配成功。所以如果想匹配cat和cot,那么就可以寫成:c[ao]t
例子

2.2字符集合區(qū)間

格式[字符集合區(qū)間]
說明:如果我們要匹配的那個(gè)位置可以是任何一個(gè)英文字符,我們?cè)撛趺磳懀堪阉锌赡艹霈F(xiàn)的英文字符都寫一遍么?那就是[abcdefghijklmnopqrstuvwxyz],這才只是小寫字母,如果我在加上大寫字母和數(shù)字呢?是不是要瘋掉了,所以字符區(qū)間就是解決這個(gè)問題,如果我們要匹配a-z的小寫字母就可以這么寫:[a-z],是不是比之前的寫法簡單多了。針對(duì)常用的幾種匹配內(nèi)容,正則表達(dá)式可以支持以下一些區(qū)間:

  • A-Z:匹配從A到Z的所有大寫字母
  • a-z:匹配從a-z的所有小寫字母
  • 0-9:匹配從0-9的所有數(shù)字

例子

2.3取非匹配

格式

[^字符集合]

說明:之前我們說的是匹配字符集合中的字符,那么問題來了,如果我們想匹配除了a的所有字符,那怎么辦?(吐個(gè)槽,a到底跟你多大仇,就是不匹配它)總不能一個(gè)個(gè)列舉可能出現(xiàn)的字符吧。所以我們可以使用取非匹配,排除掉一個(gè)a,其他字符都可以匹配,寫成:[^a],這樣就能匹配除了a的任意字符了。
例子

3.使用元字符

3.1對(duì)特殊字符進(jìn)行轉(zhuǎn)義

格式

\元字符

說明:這其實(shí)是在1.3中講的內(nèi)容,所謂元字符,就是在正則表達(dá)式中有特殊含義的字符,比如[、]、.包括\,他們匹配的字符并不是他們本身。但如果我們確實(shí)要匹配他們本身的時(shí)候,需要用\加上該字符來匹配字符本身。
例子

  1. 匹配一個(gè)數(shù)組項(xiàng) array\[0\]
  2. 匹配文件目錄 \\home\\src\\bin

3.2匹配空白字符

格式

\元字符

說明:當(dāng)需要找出原始文本中的空白字符或者換行符是怎么辦呢?系統(tǒng)內(nèi)置的幾個(gè)元字符可是實(shí)現(xiàn)該功能。

  • [\b] 回退(并刪除)一個(gè)字符
  • \f 換頁符
  • \n 換行符
  • \r 回車符
  • \t 制表符
  • \v 垂直制表符

3.3匹配特定的字符類別

  1. 匹配數(shù)字與非數(shù)字
    格式\d\D
    說明:之前說匹配數(shù)字可以用[0-9],其實(shí)更簡單的寫法是\d,兩者的意思是等價(jià)的。同理[^0-9]\D也是等價(jià)的,表示匹配除了0-9的任意字符(非數(shù)字的字符)。
    例子:匹配數(shù)組任意一項(xiàng) array\[\d\]

  2. 匹配數(shù)字和字符與非數(shù)字和字母
    格式\w\W
    說明\w匹配任何一個(gè)字母或數(shù)字(大小寫均可)或下劃線,等價(jià)于[a-zA-z0-9_]
    \W匹配任何一個(gè)字母或數(shù)字(大小寫均可)或下劃線,等價(jià)于[^a-zA-z0-9_]
    例子

  3. 匹配空白字符與非空白字符
    格式\s\S
    說明\s匹配任何一個(gè)空白字符,等價(jià)于[\f\n\r\t\v]
    \S匹配任何一個(gè)空白字符,等價(jià)于[^\f\n\r\t\v]
    例子

  4. 匹配十六進(jìn)制值與八進(jìn)制值
    格式\x\0
    說明\x匹配十六進(jìn)制數(shù)的前綴
    \0匹配八進(jìn)制數(shù)的前綴
    例子

    • \x48值為72,對(duì)應(yīng)的ASCII碼是H
    • \047值為39,對(duì)應(yīng)的ASCII碼是'

4.重復(fù)匹配

4.1有多少個(gè)匹配

  1. 匹配一個(gè)或多個(gè)
    格式字符+[字符集合]+
    說明:如果想匹配一個(gè)字符或字符集合的多次重復(fù),那么可以使用+作為后綴。比如,a+表示匹配一個(gè)或多個(gè)連續(xù)出現(xiàn)的a,[0-9]+表示匹配一個(gè)或多個(gè)連續(xù)出現(xiàn)的數(shù)字。
    例子

  2. 匹配零個(gè)或多個(gè)字符
    格式字符*[字符集合]*
    說明+至少需要匹配一個(gè)字符,而*匹配的字符則是可有可無。
    例子

  3. 匹配零個(gè)或一個(gè)字符
    格式字符?[字符集合]?
    說明:?匹配的字符要么出現(xiàn),要么只出現(xiàn)一次,只有這兩種情況。
    例子

4.2匹配的重復(fù)次數(shù)

  1. 為重復(fù)匹配次數(shù)設(shè)定一個(gè)精確值
    格式字符{重復(fù)次數(shù)}[字符集合]{重復(fù)次數(shù)}
    說明:雖然之前說的+ * ?功能很強(qiáng)大,但是很多情況下并不能滿足要求,比如要匹配一個(gè)11位數(shù)的電話號(hào)碼顯然用任意一個(gè)功能都完不成。這時(shí)就需要引入重復(fù)次數(shù),比如[0-9]{11}就表示匹配連續(xù)11個(gè)出現(xiàn)的數(shù)字,這就能匹配像電話號(hào)碼這樣的要求(當(dāng)然可能還有更詳細(xì)地約束,比如必須以1開頭,這里只是舉個(gè)簡單的例子)。
    例子

  2. 為重復(fù)匹配次數(shù)設(shè)定一個(gè)區(qū)間
    格式字符{最少重復(fù)次數(shù),最多重復(fù)次數(shù)}[字符集合]{最少重復(fù)次數(shù),最多重復(fù)次數(shù)}
    說明:為重復(fù)次數(shù)設(shè)定一個(gè)最小值和最大值,表明一個(gè)字符或字符集合最少出現(xiàn)的次數(shù)和最多出現(xiàn)的次數(shù)。
    例子

  3. 匹配至少重復(fù)多少次
    格式字符{最少重復(fù)次數(shù),}[字符集合]{最少重復(fù)次數(shù),}
    說明:有了第2點(diǎn)介紹的只是,這里就很好理解,為重復(fù)次數(shù)設(shè)定一個(gè)最小值,不設(shè)定最大值,那不就是表明一個(gè)字符至少出現(xiàn)多少次嘛!
    例子

4.3防止過度匹配

說明:之前介紹的+*{n,}都沒有定義匹配次數(shù)的上限,這就很容易造成過度匹配的現(xiàn)象。所以有必要引入“貪婪型”字符和“懶惰型”字符的概念。
貪婪型字符有:

*、+、{n,}

對(duì)應(yīng)的懶惰型字符有:

*?、+?、{n,}?

比如一個(gè)h5的頁面有很多<h2>...</h2>這樣的標(biāo)簽,如果我們使用貪婪型字符匹配可以寫成:

<h2>.*</h2>

貪婪型字符*的匹配原則是,只要沒匹配到最后一個(gè)</h2>,我就一直匹配下去,直到匹配到最后一個(gè)</h2>
使用懶惰型字符匹配可以寫成

<h2>.*?</h2>

懶惰型字符*?的匹配原則是,只要我匹配到了后面的一個(gè)</h2>,我就不干了,不匹配了,除非找到下一個(gè)<h2>,我再繼續(xù)匹配。

例子

  1. 貪婪型字符匹配


  2. 懶惰型字符匹配


5.位置匹配

5.1單詞邊界

格式\b單詞\b\b單詞單詞\b
說明:什么是邊界匹配呢?舉個(gè)簡單的例子,比如一篇英文文章,我想找其中的cat單詞,于是我這么寫:cat,看起來是沒問題,但是實(shí)際匹配的時(shí)候會(huì)將所有cat都找出來,當(dāng)然cat這個(gè)單詞能找出來是毋庸置疑的,但同時(shí)會(huì)將類似scattered這樣包含cat的單詞也找出來,著當(dāng)然不是我們所期望的,于是引入單詞邊界的概念,在cat前后各加上一個(gè)\b表示這中間是一個(gè)單詞,\b用來匹配一個(gè)單詞的開始或結(jié)尾。注意:只有\bcat\b才表示要匹配cat這個(gè)單詞,而\bcatcat\b則分別表示匹配以cat開頭和以cat結(jié)尾的單詞。
例子

  1. 不帶單詞邊界匹配


  2. 帶單詞邊界匹配


  3. 匹配cat開頭的單詞


  4. 匹配cat結(jié)尾的單詞


5.2字符串邊界

格式^字符串$^字符串字符串$
說明:與單詞邊界同理,字符串邊界表示字符串的開頭與結(jié)尾,分別用^、$表示。
例子

  1. cat開頭字符串


  2. bar結(jié)尾字符串


6.子表達(dá)式

6.1什么是子表達(dá)式

格式

(子表達(dá)式)

說明:前面我們學(xué)過如何指定重復(fù)次數(shù),用的是字符{重復(fù)次數(shù)}[字符集合]{重復(fù)次數(shù)},這里的重復(fù)次數(shù)只是前面的字符或者字符集合,加入我想將\d{1,3}\.這樣一個(gè)完整的表達(dá)式重復(fù)幾次,那怎么辦呢?我們可以用()將這樣的表達(dá)式包裹起來,將括號(hào)的內(nèi)容作為一個(gè)整體,再進(jìn)行重復(fù)次數(shù)的表示,比如如果想找出連續(xù)出現(xiàn)3次cat單詞,可以寫成這樣:(\d{1,3}\.){3}
例子:匹配IP地址

6.2子表達(dá)式的嵌套

格式

((子表達(dá)式1)|(子表達(dá)式2))

說明:子表達(dá)式是允許嵌套的,舉個(gè)例子,如果我們想匹配一串IP地址,12.159.46.200,略加思考我們不難能寫出這樣的正則表達(dá)式:(\d{1,3}\.){3}\d{1,3},但是其實(shí)這個(gè)表達(dá)式并不等價(jià)于IP地址,999.999.999.999明顯不是一個(gè)IP地址,但是它是符合這個(gè)規(guī)則的,所以我們要對(duì)這個(gè)表達(dá)式中的數(shù)字要求做出修改,IP地址的四個(gè)組成部分必須符合以下要求:

  • 任何一個(gè)1位數(shù)字或2位數(shù)字(0-99)——\d{1,2}
  • 任何一個(gè)以1開頭的3位數(shù)字(100-199)——1\d{2}
  • 任何一個(gè)以2開頭,第2位在0-4之間的3位數(shù)字(200-249)——2[0-4]\d
  • 任何一個(gè)以25開頭,第3位在0-5之間的3位數(shù)字(250-255)——25[0-5]

所以根據(jù)以上規(guī)則將原表達(dá)式改寫為:

((((25[0-5])|(2[0-4]\d)|(1\d{2})|\d{1,2})|)\.){3}(((25[0-5])|(2[0-4]\d)|(1\d{2})|\d{1,2})|)

例子


注意:這里將詳細(xì)地規(guī)則寫在前面,比如匹配200,如果檢測(cè)到20是滿足\d{1,2}的,就不會(huì)再去看后面的0了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容