正則表達式學習記錄
一,字符匹配
1。 \b 代表著單詞的開頭或結尾,也就是單詞的分界處。雖然通常英文的單詞是由空格,標點符號或者換行來分隔的,但是\b并不匹配這些單詞分隔字符中的任何一個,它只匹配一個位置。
2。 . 是另一個元字符,匹配除了換行符以外的任意字符。
3。 \n 換行符
4。 \d 匹配一個數字 【0,1,2,3.....】
5。 \w 匹配字母或數字或下劃線或漢字等
6。 \s 匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等
7。 ^ 匹配字符串的開始
8。 $ 匹配字符串的結束
9。 \ 取消字符的特殊意義,當然如何查找\ 也要用\,那么就是\\
10。 [] 匹配其中的任何一個字符,可以是范圍,也可以是指定的特定的字符
如果是范圍使用“-”符號,否則直接指定即可
11。 | 相當于編碼中的or 前后只要有一個滿足條件,即可匹配成功。
12。 () 將括號中的所有正則表達式作為一個整體
二,重復匹配數量
1。 * 同樣是元字符,不過它代表的不是字符,也不是位置,而是數量——它指定*前邊的內容可以連續重復使用任意次。
2。 {一個整數} 表示大括號前面的重復出現的次數
{一個小整數,一個大整數} 重復匹配的次數,最少不能少于,最大不能大于
例子:0\d{2}-\d{8} 以0開頭,后面跟兩位數字,以"-"符號連接,后面跟8個數字
3。 + 這里的+是和*類似的元字符,不同的是*匹配重復匹配任意次(可能是0次),而+則重復匹配1次或更多次
4。 ? 重復零次或一次,也就是可有可無
|
*
|
匹配前面的子表達式任意次。例如,zo*能匹配“z”,“zo”以及“zoo”,但是不匹配“bo”。*等價于{0,}。
|
|
+
|
匹配前面的子表達式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。
|
|
?
|
匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價于{0,1}。
|
三反義,及其他
. 常用的反義
表3.常用的反義代碼 代碼/語法 說明
\W 匹配任意不是字母,數字,下劃線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符
18 (?=exp) 也叫零寬度正預測先行斷言
(?<=exp) 也叫零寬度正回顧后發斷言
貪婪與懶惰
當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。
有時,我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一個問號?。這樣.*?就意味著匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。現在看看懶惰版的例子吧:
a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用于aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)。
為什么第一個匹配是aab(第一到第三個字符)而不是ab(第二到第三個字符)?簡單地說,因為正則表達式有另一條規則,比懶惰/貪婪規則的優先級更高:最先開始的匹配擁有最高的優先權——The match that begins earliest wins。
| 代碼/語法 | 說明 |
|---|---|
| *? | 重復任意次,但盡可能少重復 |
| +? | 重復1次或更多次,但盡可能少重復 |
| ?? | 重復0次或1次,但盡可能少重復 |
| {n,m}? | 重復n到m次,但盡可能少重復 |
| {n,}? | 重復n次以上,但盡可能少重復 |

浙公網安備 33010602011771號