定義
正則表達式就是用一個"字符串"來描述一個特征,然后區驗證另一個"字符串"是否符合這個特征
用途
- 驗證字符串是否符合指定特征,比如驗證郵件地址
- 從一個長文本中查找指定字符串,使用更加靈活
- 替換指定文本
普通規則
表達式 | 作用 |
---|---|
a | 匹配單個字符a |
2 | 匹配單個字符2 |
\r, \n | 匹配回車, 換行符 |
\t | 匹配制表符 TAB |
\ | 匹配''本身 |
^ | 匹配'^'本身 |
$ | 匹配'$'本身 |
. | 匹配'.'本身 |
\d | 匹配任意一個0-9的數字 |
\w | 匹配任意一個字母或數字或下劃線,也就是A-Z, a-z, 0-9, _ 中任意一個 |
\s | 匹配包括空格、制表符、換頁符等空白字符的任意一個 |
. | 匹配除換行符\n以外的任意一個字符(包括數字) |
[ab5@] | 匹配'a' 或 'b' 或 '5' 或 '@'中的任意一個 |
[^abc] | 匹配'a' 'b' 'c' 之外的任意一個字符 |
[a-z] | 匹配'a' 到 'z' 的任意一個字符 |
[A-Z] | 匹配'A' 到 'Z' 的任意一個字符 |
[A-Z0-3] | 匹配'A' 到 'Z' 以及 0 到 3 的任意一個字符 |
[^A-Z0-3] | 匹配除'A' 到 'Z' 以及 0 到 3 以外的任意一個字符 |
{n} | 表達式重復n次, 比如 '\w{2}'相當于\w\w, 'a{5}'相當于aaaaa |
{m, n} | 表達式至少重復m次,最多重復n次, 比如'ba{1,3}'可以匹配'ba'或'baa'或'baaa' |
{m,} | 表達式至少重復m次,沒有上限,比如'\w\d{2,}'可以匹配'a12', '_456', 'M1223'等 |
? | 表達式匹配0次或者1次,相當于{0,1},比如'a[cd]?'可以匹配'a', 'ac', 'ad' |
+ | 表達式匹配至少1次,相當于{1,},比如'a+b'可以匹配'ab', 'aab', 'aaab'等 |
* | 表達式匹配0次或任意次,相當于{0,},比如'^*b'可以匹配'b', '^b', '^^b'等 |
^ | 從字符串開始的地方匹配,不匹配任何字符, 比如'^12'可以匹配'12kp',結果為'12', 不能匹配'kp12' |
$ | 從字符串結束的地方匹配,不匹配任何字符,比如'12$'可以匹配'kp12',結果為'12',不能匹配'12kp' |
\b | 匹配一個單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符,即一邊是屬于\w,另一邊不屬于\w,比如:用'./b.'去匹配"abc_123中文d3=efg漢字%",結果是'3中', '文', '3=', 'g漢', 又比如用'\bto\b'去匹配'today to too'得到結果是:'to', 'today'以及'too'中的to并不能被匹配到,因為\b要求一邊屬于\w,另一邊不屬于\w,而'today'中的'd'也屬于\w范圍內 |
豎線 | 左右兩邊表達式是'或'的關系,匹配左邊或者右邊 |
() | (1) 在被修飾匹配次數的時候,括號中的表達式可以作為整體被修飾 (2) 取匹配結果的時候,括號中的表達式匹配到的內容可以被單獨得到 |
高級規則
- 貪婪與非貪婪
** 貪婪模式 **
在使用修飾匹配次數的特殊符號時,有多種表示方法可以使同一個表達式能夠匹配不同的次數,比如: '{m,n}', '{m,}', '?', '*', '+', 具體匹配的次數隨被匹配字符串而定,這種重復匹配不定次數的表達式在匹配過程中,總是盡可能多的匹配,比如,針對文本'dxxxdxxxd',舉例如下:
表達式 | 匹配結果 |
---|---|
(d)(\w+) | '\w+' 將匹配第一個'd'之后的所有字符'xxxdxxxd' |
(d)(\w+)(\d) | '\w+'將匹配第一個'd'和最后一個'd'之間的所有字符'xxxdxxx', 雖然'\w+'也能匹配上最后一個'd',但是為了使整個表達式匹配成功,'\w+'可以讓出它本來能夠匹配的最后一個'd' |
由此可見,'+', '*', '{m,n}'等表達式都是盡可能多的匹配,帶'?'的表達式在可匹配可不匹配的時候,也是盡可能的要匹配,這種匹配原則叫做'貪婪'模式
非貪婪模式
在修飾匹配次數的特殊符號后再加上一個'?'號,則可以使匹配次數不定的表達式盡可能少的匹配,使可匹配可不匹配的表達式,盡可能的不匹配,這種匹配原則叫做'非貪婪'模式,也叫做'勉強'模式,如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功,舉例如下,針對文本'dxxxdxxxd'匹配:
表達式 | 匹配結果 |
---|---|
(d)(\w+?) | '\w+?' 將盡可能少的匹配第一個'd'之后的字符,'\w+?'匹配結果是'x' |
(d)(\w+?)(\d) | 為了讓整個表達式匹配成功,'\w+?'不得不匹配'xxx'才可以讓后邊的'd'得到匹配,從而使整個表達式匹配成功,因此,'\w+?'匹配結果是'xxx' |
- 反向引用 \1, \2……