常用元字符
| 元字符 | 說(shuō)明 | 備注 |
|---|---|---|
| . | 匹配除換行符以外的任意字符 | 無(wú) |
| \w | 匹配字母或數(shù)字或下劃線或漢字 | 相當(dāng)于[_a-z0-9A-Z]</br>匹配n個(gè)字符: \w{n} |
| \s | 匹配任意的空白符 | 無(wú) |
| \d | 匹配數(shù)字 | 匹配數(shù)字個(gè)數(shù)區(qū)間: \d{lower, upper} |
| \b | 匹配單詞的開(kāi)始或結(jié)束 | 無(wú) |
| ^ | 匹配字符串的開(kāi)始 | 無(wú) |
| $ | 匹配字符串的結(jié)束 | 無(wú) |
反義
| 元字符 | 說(shuō)明 |
|---|---|
| \W | 匹配任意不是字母,數(shù)字,下劃線,漢字的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D | 匹配任意非數(shù)字的字符 |
| \B | 匹配不是單詞開(kāi)頭或結(jié)束的位置 |
| [^x] | 匹配除了x以外的任意字符 |
常用限定符
| 限定符 | 說(shuō)明 | 備注 |
|---|---|---|
| * | 重復(fù)零次或更多次 | 不代表任何字符,僅代表數(shù)量;</br>匹配0~n多個(gè)連續(xù)字符: \w* |
| + | 重復(fù)一次或更多次 | 無(wú) |
| ? | 重復(fù)零次或一次 | 代表某一個(gè)位置可有可無(wú) |
| {n} | 重復(fù)n次 | 無(wú) |
| {n,} | 重復(fù)n次或更多次 | 無(wú) |
| {n,m} | 重復(fù)n到m次 | 無(wú) |
分枝條件 ‘|’
相當(dāng)于或的意思,如“\d{5}-\d{4}|\d{5}”,可以匹配12345-1234,也可以匹配12345;特別需要注意的是,如果反過(guò)來(lái)寫(xiě)
“\d{5}|\d{5}-\d{4}”的話,只能匹配前5個(gè)了,因?yàn)槠ヅ湟?guī)則從左到右,左側(cè)規(guī)
則匹配上就不會(huì)管右側(cè)了
分組 ‘()’
分組用圓括號(hào)代表,所以不是分組的話,用到括號(hào)的地方需要轉(zhuǎn)義;
分組主要用于把同個(gè)匹配規(guī)則,重復(fù)多次
例:
ip地址簡(jiǎn)單配,匹配規(guī)則就是1~3位數(shù)組加“.”,重復(fù)4次
(\d{1,3}\.){4}
捕獲
使用分組()后,會(huì)自動(dòng)為它分配一個(gè)組號(hào),從1、2、3....,可以利用組號(hào)再表達(dá)式中繼續(xù)匹配操作
常用限定符
| 分類(lèi) | 語(yǔ)法 | 說(shuō)明 |
|---|---|---|
| 自動(dòng)捕獲 | (exp) | 匹配exp,并捕獲文本到自動(dòng)命名組號(hào),1、2、3... |
| 自定義組名 | (?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫(xiě)成(?'name'exp) |
| 不自動(dòng)分配組名 | (?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號(hào)(應(yīng)該沒(méi)啥用) |
例:匹配連個(gè)連續(xù)一樣的字符
\b(\w+)\b\s+\1\b
\1代表(\b(\w+)\b)匹配出來(lái)的結(jié)果,整個(gè)表達(dá)式就是要匹配連續(xù)出現(xiàn)2個(gè)相同連續(xù)的字符串
捕獲可以指定名稱,不用自動(dòng)生成的組號(hào),指定名字‘Result’來(lái)改造:
\b(?<Result>\w+)\b\s+\k<Result>\b
斷言
| 分類(lèi) | 語(yǔ)法 | 說(shuō)明 |
|---|---|---|
| 零寬度正預(yù)測(cè)先行斷言 | (?=exp) | 匹配exp前面的位置 |
| 零寬度正回顧后發(fā)斷言 | (?<=exp) | 匹配exp后面的位置 |
| 零寬度負(fù)預(yù)測(cè)先行斷言 | (?!exp) | 匹配后面跟的不是exp的位置 |
| 零寬度負(fù)回顧后發(fā)斷言 | ((?<!exp)) | 匹配前面不是exp的位置 |
- 用于斷定某些位置會(huì)出現(xiàn)哪些字符,但是結(jié)果中不會(huì)包含被斷定的這些內(nèi)容;
- (?=exp)只能放開(kāi)頭,(?<=exp)只能放結(jié)尾
樣本:"I'm singing while you're dancing"
規(guī)則:\b\w+(?=ing)
結(jié)果:sing和danc
樣本:"reading a book"
規(guī)則:(?<=\bre)\w+\b
結(jié)果:ading
- 負(fù)向零寬斷言本身不占匹配位置,只是確保會(huì)出現(xiàn)哪些字符
樣本:"Iraq fighting"
規(guī)則:\b\w*q[^u]\w*\b
結(jié)果:Iraq fighting
想要確定q后面不能緊跟著u,但是以上沒(méi)做到,應(yīng)該用以下規(guī)則
規(guī)則:\b\w*q(?!u)\w*\b
規(guī)則:(?<![a-z])\d{7}
作用: 匹配前面不是小寫(xiě)字母的七位數(shù)字
注釋
小括號(hào)的另一種用途是通過(guò)語(yǔ)法(?#comment)來(lái)包含注釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
貪婪與懶惰模式
樣本:"aabab"
規(guī)則:a.*b
結(jié)果:aabab
==為什么不是“aab”、“ab”?==
默認(rèn)是貪婪模式,盡可能匹配更多的字符。
如果改寫(xiě)成
樣本:"aabab"
規(guī)則:a.*?b
結(jié)果:aabab
加上?就會(huì)變成懶惰模式,匹配盡可能少的字符
| 語(yǔ)法 | 說(shuō)明 |
|---|---|
| *? | 重復(fù)任意次,但盡可能少重復(fù) |
| +? | 重復(fù)1次或更多次,但盡可能少重復(fù) |
| ?? | 重復(fù)0次或1次,但盡可能少重復(fù) |
| {n,m}? | 重復(fù)n到m次,但盡可能少重復(fù) |
| {n,}? | 重復(fù)n次以上,但盡可能少重復(fù) |
由于不常用容易忘記,所以記錄下;本文主要用于自己忘記的時(shí)候快速才看規(guī)則,如果想比較快速系統(tǒng)的學(xué)習(xí)正則表達(dá)式,可以到這里正則表達(dá)式30分鐘入門(mén)教程學(xué)習(xí),作者寫(xiě)的很不錯(cuò),我在不同時(shí)間段總共看了第三遍了,忘了看看了忘,每次都有收獲