字符類 |
匹配的字符 |
\d |
匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。 |
\D |
匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。 |
\w |
匹配包括下劃線的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'。 |
\W |
匹配任何非單詞字符。等價(jià)于 '[^A-Za-z0-9_]'。 |
\s |
匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于 [ \f\n\r\t\v]。 |
\S |
匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。 |
.(點(diǎn)號(hào)) |
任一字符 |
[...] |
括號(hào)中的任一字符 |
[^…] |
非括號(hào)中的任一字符 |
2.2定位控制字符
^ |
其后的模式必須在字符串的開始處,如果是多行則在任一行的開始C#需要設(shè)定Multiline標(biāo)志 |
$ |
前面的模式必須在一行的末尾,如果是多行,則在任意行的末尾 |
\A |
前面的模式必須在字符串的開始處;多行標(biāo)志被忽略 |
\z |
前面的模式必須在字符串的末尾處,多行標(biāo)志被忽略 |
\Z |
前面的模式必須位于字符串的末尾或位于換行符前 |
\b |
匹配一個(gè)單詞字符的開始,單詞字符是[a-zA-Z0-9]中的一位 |
\B |
匹配一個(gè)非單詞邊界的位置, 不在一個(gè)單詞的開始 |
2.3指定重復(fù)字符
{n} |
匹配前面的字符n次 |
{n,} |
匹配前面的字符最少n次 |
{n,m} |
匹配前面的字符n至m次 |
? |
匹配前面的字符0次或1次 |
+ |
匹配前面的字符至少1次 |
* |
匹配前面的字符至少0次 |
2.4特殊控制類
| |
指定字符替換,即該位置可以是|兩邊的任一個(gè)表達(dá)式 |
2.5 特殊字符轉(zhuǎn)義序列
\\ |
匹配”\” |
\. |
匹配“.” |
\* |
匹配“*” |
\( |
匹配“(” |
\) |
匹配”)” |
\? |
匹配“?“ |
\+ |
匹配“+“ |
\| |
匹配“|“ |
\{ |
匹配“{“ |
\} |
匹配“}“ |
\^ |
匹配“^“ |
\$ |
匹配“$“ |
\n |
匹配換行符 |
\r |
匹配回車 |
\t |
匹配Tab鍵 |
\v |
匹配垂直制表符 |
\f |
匹配換頁符 |
\nnn |
匹配一個(gè)三位八進(jìn)制數(shù)指定的ASCII字符,如\103匹配C |
\xnn |
匹配一個(gè)二位16進(jìn)制數(shù)指定的ASCII字符,例如\x43匹配C |
\unnnn |
匹配一個(gè)4位16進(jìn)制數(shù)指定的Unicode字符 |
\cV |
匹配一個(gè)控制字符,(如復(fù)制Ctrl+C) |
2.6正則表達(dá)式分組、替換、反向引用等高級(jí)應(yīng)用
以上只是正則表達(dá)式的基礎(chǔ)部分,從這里開始才算真正開始正則表達(dá)式之旅。
² 分組
分組技術(shù)可以匹配在一個(gè)組中的所有字符,用()來表示,是下面兩個(gè)技術(shù)的基礎(chǔ)所在?!埃ǎ坝址Q捕獲符號(hào)。
1. 捕獲:()
例子:ABC1EDF2UU
匹配組表達(dá)式:([A-Z]{3})\d --匹配3個(gè)連續(xù)大寫字母和一個(gè)數(shù)字
匹配結(jié)果:1.ABC1,2.EDF2
如果用C#中的group,則為ABC,EDF。因?yàn)?SPAN lang=EN-US>group搜集的是匹配組的內(nèi)容。
2.非捕獲(?:)
使用了非捕獲就說明該()中的內(nèi)容將不作為捕獲的組返回,而和其它表達(dá)式共同構(gòu)成匹配項(xiàng)返回。也就是捕獲組將不存在。
例:1AF3EDC
匹配表達(dá)式:(?:\d|[A-Z])\w --匹配一個(gè)數(shù)字或字母加一個(gè)任意的字符。
匹配結(jié)果:1.1A 2.F3 3.ED
沒有組被捕獲
2. 通過名稱捕獲(?name>)
定義了名稱捕獲的組可以在反向匹配中運(yùn)用名稱進(jìn)行反向引用而不需要再使用數(shù)字進(jìn)行反向捕獲。注意組名區(qū)分大小寫!
² 替換
替換,顧名思義,是將匹配的字符替換成其他指定的字符形式。這個(gè)功能是在分組的基礎(chǔ)上的(當(dāng)然或許可以單獨(dú)存在,但是那樣匹配的功能顯然不夠強(qiáng)大)。在這里有一個(gè)技巧是使用附加的匹配字符控制匹配內(nèi)容。
$group |
用group指定的組號(hào)進(jìn)行替換 |
${name} |
替換由?name>匹配的最后一個(gè)子串 |
$$ |
替換字符$ |
$ |
替換整個(gè)的匹配 |
$+ |
替換最后捕獲的組 |
$ |
替換整個(gè)輸入的字符串 |
² 反向引用
反向匹配可以引用前面組中的匹配形式。“\匹配組的數(shù)字表示(1為基數(shù))“或者”\kgroupname>“
² 高級(jí)組
1. 正聲明(?=)
規(guī)定了括號(hào)中的模式必須出現(xiàn)在聲明的右側(cè)。模式將不構(gòu)成匹配的一部分。
2. 負(fù)聲明(?!)
規(guī)定了括號(hào)中的模式不能出現(xiàn)在聲明的右側(cè),模式將不構(gòu)成匹配的一部分。
3. 反向正聲明(?=)
規(guī)定了括號(hào)中的模式必須出現(xiàn)在聲明的左側(cè),模式將不構(gòu)成匹配的一部分。
4. 反向負(fù)聲明(?!)
規(guī)定了括號(hào)中的模式必須出現(xiàn)在聲明的左側(cè)。模式不構(gòu)成匹配的一部分。
5. 非回溯(?>)
防止了正則表達(dá)式引擎搜索失敗時(shí)回溯,這稱之為貪婪的子表達(dá)式。
如輸入字符串:He was very trusting.
正則表達(dá)式:.*ing將匹配trusting但是如果加入(?>)ing則不能完成匹配。
非回溯組也是非捕獲組。他對(duì)于提高正則表達(dá)式的效率很有效。
如匹配一個(gè)www.****.com的網(wǎng)址。使用www\.(.*)\.com顯然要比www\.([^.]*)\.com效率要低的多,因?yàn)榍罢弑仨毷褂媒M中的回溯操作,回溯是很艱難的過程,所以當(dāng)使用非回溯的正則表達(dá)式時(shí)時(shí)可以顯著提高正則表達(dá)式的效率的。
其實(shí)正則表達(dá)式是只注重匹配結(jié)果的,所以會(huì)努力去匹配所存在的字符串。這就是它的貪婪性所在。(這點(diǎn)其實(shí)理解的不是太深)。
注意以上這些(1-5)都不能夠用于反向引用,因?yàn)橐陨下暶鲗⒉蛔鳛槠ヅ涞囊徊糠帧?/FONT>
2.7在正則表達(dá)式中做決策
高級(jí)決策的兩種寫法:
1=>(?(expression)yes|no)
2=>(?(?=expression)yes|no)
這兩種方式中的的expression匹配則后面進(jìn)行匹配yes,否則匹配no。
需要注意的一點(diǎn)是yes測(cè)試和決策測(cè)試是在同一個(gè)起點(diǎn)里進(jìn)行的。
如以下字符串:77-77A 69-AA 57-B
匹配表達(dá)式為:(\d7)?-(?(1)\d\d[A-Z]|[A-Z][A-Z])
匹配結(jié)果為:
1.77-77A 2. –AA
這個(gè)正則表達(dá)式中用到了引用組,(?(1)**)中的1也可以換為\1,這樣不影響匹配。這個(gè)匹配中如果將決策后面的\d\d去掉則會(huì)出現(xiàn)不同的結(jié)果,這時(shí)只會(huì)有一個(gè)-AA是匹配的。因?yàn)闆Q策點(diǎn)和yes表達(dá)式是從同一個(gè)起點(diǎn)開始匹配所以即使決策點(diǎn)匹配了,但是后面的yes表達(dá)式仍然不匹配。就只匹配no部分的表達(dá)式。最終結(jié)果也必然改變,理解這一點(diǎn)很重要。
2.8 正則表達(dá)式的選項(xiàng)
快到結(jié)尾了,再說下正則表達(dá)式的選項(xiàng)。選項(xiàng)其實(shí)就是將正則表達(dá)式的設(shè)置改到組中來。如(?i:[a-z])將忽略大小寫進(jìn)行匹配。實(shí)際上如果學(xué)過Javascript中的正則表達(dá)式,可以看出這個(gè)i在javascript中表示的還是這個(gè)意思。
N |
規(guī)定只有顯示命名的組標(biāo)號(hào)的組才能有效的捕獲 |
I |
此選項(xiàng)匹配不區(qū)分大小寫的匹配 |
X |
此選項(xiàng)規(guī)定,非轉(zhuǎn)義的空字符被排除在模式之外,并啟用了一個(gè)前綴#的注釋 |
M |
指定多行模式,修改了^和$的定義 |
S |
指定單行模式 |
2.9正則表達(dá)式的規(guī)則
1.正則表達(dá)式會(huì)對(duì)輸入字符傳進(jìn)行最快的匹配,它一次搜索一個(gè)字符,知道實(shí)現(xiàn)第一次匹配。
2.發(fā)現(xiàn)一個(gè)匹配的開始后,正則表達(dá)式引擎將繼續(xù)匹配,直到遇到一個(gè)不被模式接收的字符。
3.Regex引擎非常貪婪—只要模式匹配它將匹配盡可能多的字符。
4.Regex渴望實(shí)現(xiàn)匹配,所以將在需要時(shí)回溯以實(shí)現(xiàn)匹配。
5.Regex引擎總是先選擇第一個(gè)選項(xiàng)。在|式表達(dá)式中。
以上的幾點(diǎn)很重要。到這正則表達(dá)式的幾乎所有規(guī)則也就講完了。
最后附一個(gè)懶惰匹配常用修飾和其他的限定
*? |
盡可能少地使用重復(fù)的第一個(gè)匹配 |
+? |
盡可能少地使用重復(fù)但至少使用一次 |
?? |
使用零次重復(fù)(如有可能)或一次重復(fù) |
{n}? |
等同于{n} |
{n, }? |
盡可能少地使用重復(fù)但至少使用n次 |
{n,m}? |
介于n和m之間,盡可能少地使用重復(fù) |
標(biāo)簽:玉林 吉林 昆明 河北 西寧 怒江 秦皇島 茂名
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《正則表達(dá)式 學(xué)習(xí)資料整理》,本文關(guān)鍵詞 正則,表達(dá)式,學(xué)習(xí)資料,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。