正則表達(dá)式30分鐘入門教程 作者:deerchao
練習(xí)環(huán)境 http://regexr.com/
常用的元字符
| 代碼 | 說明 |
|---|---|
| . | 匹配除換行符以外的任意字符 |
| \w | 匹配字母或數(shù)字或下劃線或漢字 |
| \s | 匹配任意的空白符 |
| \d | 匹配數(shù)字 |
| \b | 匹配單詞的開始或結(jié)束 |
| ^ | 匹配字符串的開始 |
| $ | 匹配字符串的結(jié)束 |
反義
** 除了這些字符都可以**
| 代碼/語法 | 說明 |
|---|---|
| \W | 匹配任意不是字母,數(shù)字,下劃線,漢字的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D | 匹配任意非數(shù)字的字符 |
| \B | 匹配不是單詞開頭或結(jié)束的位置 |
| [^x] | 匹配除了x以外的任意字符 |
| [^aeiou] | 匹配除了aeiou這幾個(gè)字母以外的任意字符 |
重復(fù)
| 代碼/語法 | 說明 |
|---|---|
| * | 重復(fù)零次或更多次 |
| + | 重復(fù)一次或更多次 |
| ? | 重復(fù)零次或一次 |
| {n} | 重復(fù)n次 |
| {n,} | 重復(fù)n次或更多次 |
| {n,m} | 重復(fù)n到m次 |
貪婪與懶惰
- 貪婪正則表達(dá)式中包含能接受重復(fù)的限定符時(shí),通常的行為是匹配盡可能多的字符
-
懶惰 匹配任意數(shù)量的重復(fù),但是在能使整個(gè)匹配成功的前提下使用最少的重復(fù)
例 a.*b,它將會匹配最長的以a開始,以b結(jié)束的字符串,aabab的話,它會匹配整個(gè)字符串a(chǎn)abab (Markdown使用了轉(zhuǎn)義\ *)
a.*?b匹配最短的,以a開始,以b結(jié)束的字符串,aabab的話,它會匹配aab(第一到第三個(gè)字符)和ab(第四到第五個(gè)字符)
| 代碼/語法 | 說明 |
|---|---|
| *? | 重復(fù)任意次,但盡可能少重復(fù) |
| +? | 重復(fù)1次或更多次,但盡可能少重復(fù) |
| ?? | 重復(fù)0次或1次,但盡可能少重復(fù) |
| {n,m}? | 重復(fù)n到m次,但盡可能少重復(fù) |
| {n,}? | 重復(fù)n次以上,但盡可能少重復(fù) |
轉(zhuǎn)義
- 如果你想查找元字符本身的話,比如你查找.,或者*,就出現(xiàn)了問題:你沒辦法指定它們,因?yàn)樗鼈儠唤忉尦蓜e的意思。這時(shí)你就得使用\來取消這些字符的特殊意義。因此,你應(yīng)該使用\.和\*。當(dāng)然,要查找\本身,你也得用\\
例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows
(
字符類
- [元字符或者漢字等無元字符對應(yīng)項(xiàng)的字符]
意思是符合[]中任一個(gè)字符都可以
例[0-9]表示是0-9之間任一個(gè)字符都可以,[h我]代表h或“我”都可以,而不是“h我”兩個(gè)連續(xù)
[0-9a-zA-Z]
分支條件
條件1 | 條件2 | 條件3...
符合條件1的字段被檢索后,即使該處符合二條件也不會被檢索到
分組
一段重復(fù)的字符(子表達(dá)式/分組)
(子表達(dá)式){重復(fù)}
例ip地址
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
表4.常用分組語法
| 分類 | 代碼/語法 | 說明 |
|---|---|---|
| 捕獲 | (exp) | 匹配exp,并捕獲文本到自動命名的組里 |
| (?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp) | |
| (?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 | |
| 零寬斷言 | (?=exp) | 匹配exp前面的位置 |
| (?<=exp) | 匹配exp后面的位置 | |
| (?!exp) | 匹配后面跟的不是exp的位置 | |
| (?<!exp) | 匹配前面不是exp的位置 | |
| **注釋 ** | (?#comment) | 這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀 |
后向引用(捕獲)
** 引用已檢索到的文本**
- 使用小括號指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(也就是此分組捕獲的內(nèi)容)可以在表達(dá)式或其它程序中作進(jìn)一步的處理。默認(rèn)情況下,每個(gè)分組會自動擁有一個(gè)組號,規(guī)則是:從左向右,以分組的左括號為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號為1,第二個(gè)為2,以此類推。
- 后向引用用于重復(fù)搜索前面某個(gè)分組匹配的文本。例如,\1代表分組1匹配的文本
- 例
\b(\w+)\b\s+\1\b可以用來匹配重復(fù)的單詞,像go go, 或者kitty kitty。這個(gè)表達(dá)式首先是一個(gè)單詞,也就是單詞開始處和結(jié)束處之間的多于一個(gè)的字母或數(shù)字(\b(\w+)\b),這個(gè)單詞會被捕獲到編號為1的分組中,然后是1個(gè)或幾個(gè)空白符(\s+),最后是分組1中捕獲的內(nèi)容(也就是前面匹配的那個(gè)單詞)(\1)。 - 自定義組名
(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個(gè)分組捕獲的內(nèi)容,你可以使用\k<Word>,所以上一個(gè)例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b
| 代碼/語法 | 說明 |
|---|---|
| (exp) | 匹配exp,并捕獲文本到自動命名的組里 |
| (?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp) |
| (?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 |
零寬斷言
匹配某字段/非某字段前后的內(nèi)容
它只匹配一個(gè)位置,并不消費(fèi)任何字符
| 代碼/語法 | 說明 |
|---|---|
| (?=exp) | 匹配exp前面的位置 |
| (?<=exp) | 匹配exp后面的位置 |
| (?!exp) | 匹配后面跟的不是exp的位置 |
| (?<!exp) | 匹配前面不是exp的位置 |
例
\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時(shí),它會匹配sing和danc
(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時(shí),它匹配ading。
注釋
小括號的另一種用途是通過語法(?#comment)來包含注釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。[這里為了書寫markdown,用了轉(zhuǎn)義字符( 25[0-5](?#25 ]
要包含注釋的話,最好是啟用“忽略模式里的空白符”選項(xiàng),這樣在編寫表達(dá)式時(shí)能任意的添加空格,Tab,換行,而實(shí)際使用時(shí)這些都將被忽略。啟用這個(gè)選項(xiàng)后,在#后面到這一行結(jié)束的所有文本都將被當(dāng)成注釋忽略掉。例如,我們可以前面的一個(gè)表達(dá)式寫成這樣:

處理選項(xiàng)
| 名稱 | 說明 |
|---|---|
| IgnoreCase(忽略大小寫) | 匹配時(shí)不區(qū)分大小寫。 |
| Multiline(多行模式) | 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個(gè)字符串的開頭和結(jié)尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結(jié)束前的位置.) |
| Singleline(單行模式) | 更改.的含義,使它與每一個(gè)字符匹配(包括換行符\n)。 |
| IgnorePatternWhitespace(忽略空白) | 忽略表達(dá)式中的非轉(zhuǎn)義空白并啟用由#標(biāo)記的注釋。 |
| ExplicitCapture(顯式捕獲) | 僅捕獲已被顯式命名的組。 |
在C#中,你可以使用[Regex(String, RegexOptions)構(gòu)造函數(shù)](http://msdn2.microsoft.com/zh-cn/library/h5845fdz.aspx)來設(shè)置正則表達(dá)式的處理選項(xiàng)。
如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
平衡組/遞歸匹配
不想學(xué)了,暫停在這里這里
其他
| 代碼/語法 | 說明 |
|---|---|
| \a | 報(bào)警字符(打印它的效果是電腦嘀一聲) |
| \b | 通常是單詞分界位置,但如果在字符類里使用代表退格 |
| \t | 制表符,Tab |
| \r | 回車 |
| \v | 豎向制表符 |
| \f | 換頁符 |
| \n | 換行符 |
| \e | Escape |
| \0nn | ASCII代碼中八進(jìn)制代碼為nn的字符 |
| \xnn | ASCII代碼中十六進(jìn)制代碼為nn的字符 |
| \unnnn | Unicode代碼中十六進(jìn)制代碼為nnnn的字符 |
| \cN | ASCII控制字符。比如\cC代表Ctrl+C |
| \A | 字符串開頭(類似^,但不受處理多行選項(xiàng)的影響) |
| \Z | 字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響) |
| \z | 字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響) |
| \G | 當(dāng)前搜索的開頭 |
| \p{name} | Unicode中命名為name的字符類,例如\p{IsGreek} |
| (?>exp) | 貪婪子表達(dá)式 |
| (?<x>-<y>exp) | 平衡組 |
| (?im-nsx:exp) | 在子表達(dá)式exp中改變處理選項(xiàng) |
| (?im-nsx) | 為表達(dá)式后面的部分改變處理選項(xiàng) |
| (?(exp)yes|no) | 把exp當(dāng)作零寬正向先行斷言,如果在這個(gè)位置能匹配,使用yes作為此組的表達(dá)式;否則使用no |
| (?(exp)yes) | 同上,只是使用空表達(dá)式作為no |
| (?(name)yes|no) | 如果命名為name的組捕獲到了內(nèi)容,使用yes作為表達(dá)式;否則使用no |
| (?(name)yes) | 同上,只是使用空表達(dá)式作為no |