正則表達式

拷貝自GitHubCyC2018

一蒋川、概述

正則表達式用于文本內(nèi)容的查找和替換。

正則表達式內(nèi)置于其它語言或者軟件產(chǎn)品中撩笆,它本身不是一種語言或者軟件捺球。

正則表達式在線工具

二、匹配單個字符

. 可以用來匹配任何的單個字符夕冲,但是在絕大多數(shù)實現(xiàn)里面氮兵,不能匹配換行符;

. 是元字符歹鱼,表示它有特殊的含義泣栈,而不是字符本身的含義。如果需要匹配 . 弥姻,那么要用 \ 進行轉義南片,即在 . 前面加上 \ 。

正則表達式一般是區(qū)分大小寫的庭敦,但是也有些實現(xiàn)是不區(qū)分疼进。

正則表達式

nam.

匹配結果

My name is Zheng.

三、匹配一組字符

[ ] 定義一個字符集合螺捐;

0-9颠悬、a-z 定義了一個字符區(qū)間,區(qū)間使用 ASCII 碼來確定定血,字符區(qū)間在 [ ] 中使用赔癌。

- 只有在 [ ] 之間才是元字符,在 [ ] 之外就是一個普通字符澜沟;

^ 在 [ ] 中是取非操作灾票。

應用

匹配以 abc 為開頭,并且最后一個字母不為數(shù)字的字符串:

正則表達式

abc[^0-9]

匹配結果

  1. abcd
  2. abc1
  3. abc2

四茫虽、使用元字符

匹配空白字符

元字符 說明
[\b] 回退(刪除)一個字符
\f 換頁符
\n 換行符
\r 回車符
\t 制表符
\v 垂直制表符

\r\n 是 Windows 中的文本行結束標簽刊苍,在 Unix/Linux 則是 \n既们。

\r\n\r\n 可以匹配 Windows 下的空白行,因為它匹配兩個連續(xù)的行尾標簽正什,而這正是兩條記錄之間的空白行啥纸;

匹配特定的字符類別

1. 數(shù)字元字符

元字符 說明
\d 數(shù)字字符,等價于 [0-9]
\D 非數(shù)字字符婴氮,等價于 [^0-9]

2. 字母數(shù)字元字符

元字符 說明
\w 大小寫字母斯棒,下劃線和數(shù)字,等價于 [a-zA-Z0-9_]
\W 對 \w 取非

3. 空白字符元字符

元字符 說明
\s 任何一個空白字符主经,等價于 [\f\n\r\t\v]
\S 對 \s 取非

\x 匹配十六進制字符荣暮,\0 匹配八進制,例如 \x0A 對應 ASCII 字符 10罩驻,等價于 \n穗酥。

五、重復匹配

  • + 匹配 1 個或者多個字符
  • ** * 匹配 0 個或者多個
  • ? 匹配 0 個或者 1 個

應用

匹配郵箱地址惠遏。

正則表達式

[\w.]+@\w+\.\w+

[\w.] 匹配的是字母數(shù)字或者 . 砾跃,在其后面加上 + ,表示匹配多次爽哎。在字符集合 [ ] 里蜓席,. 不是元字符;

匹配結果

abc.def<span>@</span>qq.com

  • {n} 匹配 n 個字符
  • {m,n} 匹配 m~n 個字符
  • {m,} 至少匹配 m 個字符

* 和 + 都是貪婪型元字符课锌,會匹配盡可能多的內(nèi)容厨内。在后面加 ? 可以轉換為懶惰型元字符,例如 *?渺贤、+? 和 {m,n}? 雏胃。

正則表達式

a.+c

由于 + 是貪婪型的,因此 .+ 會匹配更可能多的內(nèi)容志鞍,所以會把整個 abcabcabc 文本都匹配瞭亮,而不是只匹配前面的 abc 文本。用懶惰型可以實現(xiàn)匹配前面的固棚。

匹配結果

abcabcabc

六统翩、位置匹配

單詞邊界

\b 可以匹配一個單詞的邊界,邊界是指位于 \w 和 \W 之間的位置此洲;\B 匹配一個不是單詞邊界的位置厂汗。

\b 只匹配位置,不匹配字符呜师,因此 \babc\b 匹配出來的結果為 3 個字符娶桦。

字符串邊界

^ 匹配整個字符串的開頭,$ 匹配結尾。

^ 元字符在字符集合中用作求非衷畦,在字符集合外用作匹配字符串的開頭栗涂。

分行匹配模式(multiline)下,換行被當做字符串的邊界祈争。

應用

匹配代碼中以 // 開始的注釋行

正則表達式

^\s*\/\/.*$

<div align="center"> <img src="pics/600e9c75-5033-4dad-ae2b-930957db638e.png"/> </div>

匹配結果

  1. public void fun() {
  2. ???? // 注釋 1
  3. ???? int a = 1;
  4. ???? int b = 2;
  5. ???? // 注釋 2
  6. ???? int c = a + b;
  7. }

七斤程、使用子表達式

使用 ( ) 定義一個子表達式。子表達式的內(nèi)容可以當成一個獨立元素铛嘱,即可以將它看成一個字符暖释,并且使用 * 等元字符。

子表達式可以嵌套墨吓,但是嵌套層次過深會變得很難理解。

正則表達式

(ab){2,}

匹配結果

ababab

| 是或元字符纹磺,它把左邊和右邊所有的部分都看成單獨的兩個部分帖烘,兩個部分只要有一個匹配就行。

正則表達式

(19|20)\d{2}

匹配結果

  1. 1900
  2. 2010
  3. 1020

應用

匹配 IP 地址橄杨。

IP 地址中每部分都是 0-255 的數(shù)字秘症,用正則表達式匹配時以下情況是合法的:

  • 一位數(shù)字
  • 不以 0 開頭的兩位數(shù)字
  • 1 開頭的三位數(shù)
  • 2 開頭,第 2 位是 0-4 的三位數(shù)
  • 25 開頭式矫,第 3 位是 0-5 的三位數(shù)

正則表達式

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

匹配結果

  1. 192.168.0.1
  2. 00.00.00.00
  3. 555.555.555.555

八乡摹、回溯引用

回溯引用使用 \n 來引用某個子表達式,其中 n 代表的是子表達式的序號采转,從 1 開始聪廉。它和子表達式匹配的內(nèi)容一致,比如子表達式匹配到 abc故慈,那么回溯引用部分也需要匹配 abc 板熊。

應用

匹配 HTML 中合法的標題元素。

正則表達式

\1 將回溯引用子表達式 (h[1-6]) 匹配的內(nèi)容察绷,也就是說必須和子表達式匹配的內(nèi)容一致干签。

<(h[1-6])>\w*?<\/\1>

匹配結果

  1. <h1>x</h1>
  2. <h2>x</h2>
  3. <h3>x</h1>

替換

需要用到兩個正則表達式。

應用

修改電話號碼格式拆撼。

文本

313-555-1234

查找正則表達式

(\d{3})(-)(\d{3})(-)(\d{4})

替換正則表達式

在第一個子表達式查找的結果加上 () 容劳,然后加一個空格,在第三個和第五個字表達式查找的結果中間加上 - 進行分隔闸度。

($1) $3-$5

結果

(313) 555-1234

大小寫轉換

元字符 說明
\l 把下個字符轉換為小寫
\u 把下個字符轉換為大寫
\L 把\L 和\E 之間的字符全部轉換為小寫
\U 把\U 和\E 之間的字符全部轉換為大寫
\E 結束\L 或者\U

應用

把文本的第二個和第三個字符轉換為大寫竭贩。

文本

abcd

查找

(\w)(\w{2})(\w)

替換

$1\U$2\E$3

結果

aBCd

九、前后查找

前后查找規(guī)定了匹配的內(nèi)容首尾應該匹配的內(nèi)容筋岛,但是又不包含首尾匹配的內(nèi)容娶视。向前查找用 ?= 來定義,它規(guī)定了尾部匹配的內(nèi)容,這個匹配的內(nèi)容在 ?= 之后定義肪获。所謂向前查找寝凌,就是規(guī)定了一個匹配的內(nèi)容,然后以這個內(nèi)容為尾部向前面查找需要匹配的內(nèi)容孝赫。向后匹配用 ?<= 定義(注: javaScript 不支持向后匹配, java 對其支持也不完善)较木。

應用

查找出郵件地址 @ 字符前面的部分。

正則表達式

\w+(?=@)

結果

abc @qq.com

對向前和向后查找取非青柄,只要把 = 替換成 ! 即可伐债,比如 (?=) 替換成 (?!) 。取非操作使得匹配那些首尾不符合要求的內(nèi)容致开。

十峰锁、嵌入條件

回溯引用條件

條件判斷為某個子表達式是否匹配,如果匹配則需要繼續(xù)匹配條件表達式后面的內(nèi)容双戳。

正則表達式

子表達式 (\() 匹配一個左括號虹蒋,其后的 ? 表示匹配 0 個或者 1 個。 ?(1) 為條件飒货,當子表達式 1 匹配時條件成立魄衅,需要執(zhí)行 ) 匹配,也就是匹配右括號塘辅。

(\()?abc(?(1)\))

結果

  1. (abc)
  2. abc
  3. (abc

前后查找條件

條件為定義的首尾是否匹配晃虫,如果匹配,則繼續(xù)執(zhí)行后面的匹配扣墩。注意哲银,首尾不包含在匹配的內(nèi)容中。

正則表達式

?(?=-) 為前向查找條件沮榜,只有在以 - 為前向查找的結尾能匹配 \d{5} 盘榨,才繼續(xù)匹配 -\d{4} 。

\d{5}(?(?=-)-\d{4})

結果

  1. 11111
  2. 22222-
  3. 33333-4444

參考資料

  • BenForta. 正則表達式必知必會 [M]. 人民郵電出版社, 2007.

微信公眾號

更多精彩內(nèi)容將發(fā)布在微信公眾號 CyC2018 上蟆融,你也可以在公眾號后臺和我交流學習和求職相關的問題草巡。另外,公眾號提供了該項目的 PDF 等離線閱讀版本型酥,后臺回復 "下載" 即可領取山憨。公眾號也提供了一份技術面試復習大綱,不僅系統(tǒng)整理了面試知識點弥喉,而且標注了各個知識點的重要程度郁竟,從而幫你理清多而雜的面試知識點,后臺回復 "大綱" 即可領取由境。我基本是按照這個大綱來進行復習的棚亩,對我拿到了 BAT 頭條等 Offer 起到很大的幫助蓖议。你們完全可以和我一樣根據(jù)大綱上列的知識點來進行復習,就不用看很多不重要的內(nèi)容讥蟆,也可以知道哪些內(nèi)容很重要從而多安排一些復習時間勒虾。


<div align="center"><img width="510px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公眾號海報7.png"></img></div>

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘸彤,隨后出現(xiàn)的幾起案子修然,更是在濱河造成了極大的恐慌,老刑警劉巖质况,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愕宋,死亡現(xiàn)場離奇詭異,居然都是意外死亡结榄,警方通過查閱死者的電腦和手機中贝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潭陪,“玉大人雄妥,你說我怎么就攤上這事∫浪荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵瘟则,是天一觀的道長黎炉。 經(jīng)常有香客問我,道長醋拧,這世上最難降的妖魔是什么慷嗜? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮丹壕,結果婚禮上庆械,老公的妹妹穿的比我還像新娘。我一直安慰自己菌赖,他們只是感情好缭乘,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琉用,像睡著了一般堕绩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邑时,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天奴紧,我揣著相機與錄音,去河邊找鬼晶丘。 笑死黍氮,一個胖子當著我的面吹牛唐含,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沫浆,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼捷枯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了件缸?” 一聲冷哼從身側響起铜靶,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎他炊,沒想到半個月后争剿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡痊末,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年蚕苇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凿叠。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩笤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盒件,到底是詐尸還是另有隱情蹬碧,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布炒刁,位于F島的核電站恩沽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翔始。R本人自食惡果不足惜罗心,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望城瞎。 院中可真熱鬧渤闷,春花似錦、人聲如沸脖镀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽认然。三九已至补憾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卷员,已是汗流浹背盈匾。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毕骡,地道東北人削饵。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓岩瘦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窿撬。 傳聞我的和親對象是個殘疾皇子启昧,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 幾個正則表達式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
    沒技術的BUG開發(fā)攻城獅閱讀 4,589評論 0 23
  • 正則表達式到底是什么東西?字符是計算機軟件處理文字時最基本的單位劈伴,可能是字母密末,數(shù)字,標點符號跛璧,空格严里,換行符,漢字等...
    獅子挽歌閱讀 2,148評論 0 9
  • Python中的正則表達式(re) import rere.match #從開始位置開始匹配追城,如果開頭沒有則無re...
    BigJeffWang閱讀 7,085評論 0 99
  • 注:本篇文章只為方便查看刹碾,特此保留,如有冒犯座柱,敬請諒解C灾摹!色洞! 本文目標 30分鐘內(nèi)讓你明白正則表達式是什么戏锹,并對它...
    阿杰Alex閱讀 1,483評論 0 10
  • 本文譯自 制作正則引擎的作者 Jan Goyvaerts 為工具 RegexBuddy 寫的教程版權歸原作者所有注...
    極客圈閱讀 3,290評論 0 25