*匹配除了換行之外的所有字符
合法IP的正則表達(dá)式 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
\s匹配任意的空白符、(空格、制表符、換行符、中文全角空格)
\w匹配字母或數(shù)字或下劃線或漢字
表1.常用的元字符代碼 | 說明 |
---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數(shù)字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數(shù)字 |
\b | 匹配單詞的開始或結(jié)束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結(jié)束 |
表2.常用的限定符代碼/語法 | 說明 |
---|
* | 重復(fù)零次或更多次 |
+ | 重復(fù)一次或更多次 |
? | 重復(fù)零次或一次 |
{n} | 重復(fù)n次 |
{n,} | 重復(fù)n次或更多次 |
{n,m} | 重復(fù)n到m次 |
后向引用
使用小括號(hào)指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(也就是此分組捕獲的內(nèi)容)可以在表達(dá)式或其它程序中作進(jìn)一步的處理。默認(rèn)情況下,每個(gè)分組會(huì)自動(dòng)擁有一個(gè)組號(hào),規(guī)則是:從左向右,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1,第二個(gè)為2,以此類推。
后向引用用于重復(fù)搜索前面某個(gè)分組匹配的文本。例如,\1代表分組1匹配的文本。難以理解?請(qǐng)看示例:
\b(\w+)\b\s+\1\b可以用來匹配重復(fù)的單詞,像go go, 或者kitty kitty。這個(gè)表達(dá)式首先是一個(gè)單詞,也就是單詞開始處和結(jié)束處之間的多于一個(gè)的字母或數(shù)字(\b(\w+)\b),這個(gè)單詞會(huì)被捕獲到編號(hào)為1的分組中,然后是1個(gè)或幾個(gè)空白符(\s+),最后是分組1中捕獲的內(nèi)容(也就是前面匹配的那個(gè)單詞)(\1)。
你也可以自己指定子表達(dá)式的組名。要指定一個(gè)子表達(dá)式的組名,請(qǐng)使用這樣的語法:(?<Word>\w+)(或者把尖括號(hào)換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個(gè)分組捕獲的內(nèi)容,你可以使用\k<Word>,所以上一個(gè)例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b。
使用小括號(hào)的時(shí)候,還有很多特定用途的語法。下面列出了最常用的一些:
表4.常用分組語法分類 | 代碼/語法 | 說明 |
---|
捕獲 | (exp) | 匹配exp,并捕獲文本到自動(dòng)命名的組里 |
---|
(?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp) |
(?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號(hào) |
零寬斷言 | (?=exp) | 匹配exp前面的位置 |
---|
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
注釋 | (?#comment) | 這種類型的分組不對(duì)正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀 |
---|
表5.懶惰限定符代碼/語法 | 說明 |
---|
*? | 重復(fù)任意次,但盡可能少重復(fù) |
+? | 重復(fù)1次或更多次,但盡可能少重復(fù) |
?? | 重復(fù)0次或1次,但盡可能少重復(fù) |
{n,m}? | 重復(fù)n到m次,但盡可能少重復(fù) |
{n,}? | 重復(fù)n次以上,但盡可能少重復(fù) |
表6.常用的處理選項(xiàng)名稱 | 說明 |
---|
IgnoreCase(忽略大小寫) | 匹配時(shí)不區(qū)分大小寫。 |
Multiline(多行模式) | 更改^和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個(gè)字符串的開頭和結(jié)尾匹配。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結(jié)束前的位置.) |
Singleline(單行模式) | 更改.的含義,使它與每一個(gè)字符匹配(包括換行符\n)。 |
IgnorePatternWhitespace(忽略空白) | 忽略表達(dá)式中的非轉(zhuǎn)義空白并啟用由#標(biāo)記的注釋。 |
RightToLeft(從右向左查找) | 匹配從右向左而不是從左向右進(jìn)行。 |
ExplicitCapture(顯式捕獲) | 僅捕獲已被顯式命名的組。 |
ECMAScript(JavaScript兼容模式) | 使表達(dá)式的行為與它在JavaScript里的行為一致。 |
表7.尚未詳細(xì)討論的語法代碼/語法 | 說明 |
---|
\a | 報(bào)警字符(打印它的效果是電腦嘀一聲) |
\b | 通常是單詞分界位置,但如果在字符類里使用代表退格 |
\t | 制表符,Tab |
\r | 回車 |
\v | 豎向制表符 |
\f | 換頁(yè)符 |
\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 |