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