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