一蒋川、概述
正則表達式用于文本內(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]
匹配結果
- abcd
- abc1
- 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>
匹配結果
- public void fun() {
- ???? // 注釋 1
- ???? int a = 1;
- ???? int b = 2;
- ???? // 注釋 2
- ???? int c = a + b;
- }
七斤程、使用子表達式
使用 ( ) 定義一個子表達式。子表達式的內(nèi)容可以當成一個獨立元素铛嘱,即可以將它看成一個字符暖释,并且使用 * 等元字符。
子表達式可以嵌套墨吓,但是嵌套層次過深會變得很難理解。
正則表達式
(ab){2,}
匹配結果
ababab
| 是或元字符纹磺,它把左邊和右邊所有的部分都看成單獨的兩個部分帖烘,兩個部分只要有一個匹配就行。
正則表達式
(19|20)\d{2}
匹配結果
- 1900
- 2010
- 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))
匹配結果
- 192.168.0.1
- 00.00.00.00
- 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>
匹配結果
- <h1>x</h1>
- <h2>x</h2>
- <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)\))
結果
- (abc)
- abc
- (abc
前后查找條件
條件為定義的首尾是否匹配晃虫,如果匹配,則繼續(xù)執(zhí)行后面的匹配扣墩。注意哲银,首尾不包含在匹配的內(nèi)容中。
正則表達式
?(?=-) 為前向查找條件沮榜,只有在以 - 為前向查找的結尾能匹配 \d{5} 盘榨,才繼續(xù)匹配 -\d{4} 。
\d{5}(?(?=-)-\d{4})
結果
- 11111
- 22222-
- 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>