![正則表達(dá)式講義_第1頁(yè)](http://file4.renrendoc.com/view/24b21f1ca6bccb074f512b28d20ec146/24b21f1ca6bccb074f512b28d20ec1461.gif)
![正則表達(dá)式講義_第2頁(yè)](http://file4.renrendoc.com/view/24b21f1ca6bccb074f512b28d20ec146/24b21f1ca6bccb074f512b28d20ec1462.gif)
![正則表達(dá)式講義_第3頁(yè)](http://file4.renrendoc.com/view/24b21f1ca6bccb074f512b28d20ec146/24b21f1ca6bccb074f512b28d20ec1463.gif)
![正則表達(dá)式講義_第4頁(yè)](http://file4.renrendoc.com/view/24b21f1ca6bccb074f512b28d20ec146/24b21f1ca6bccb074f512b28d20ec1464.gif)
![正則表達(dá)式講義_第5頁(yè)](http://file4.renrendoc.com/view/24b21f1ca6bccb074f512b28d20ec146/24b21f1ca6bccb074f512b28d20ec1465.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
正則表達(dá)式講義目錄2入門(mén)簡(jiǎn)介3正則表達(dá)式起源4什么是正則表達(dá)式5范例講解6PHP中使用正則表達(dá)式的函數(shù)7常用表達(dá)式8基本語(yǔ)法9學(xué)習(xí)方法10作業(yè)11參考資料入門(mén)簡(jiǎn)介簡(jiǎn)單的說(shuō),正則表達(dá)式是一種可以用于模式匹配和替換的強(qiáng)有力的工具。我們可以在幾乎所有的基于UNIX系統(tǒng)的工具中找到正則表達(dá)式的身影,例如,vi編輯器,Perl或PHP腳本語(yǔ)言,以及awk或sedshell程序等。此外,象JavaScript這種客戶(hù)端的腳本語(yǔ)言也提供了對(duì)正則表達(dá)式的支持。由此可見(jiàn),正則表達(dá)式已經(jīng)超出了某種語(yǔ)言或某個(gè)系統(tǒng)的局限,成為人們廣為接受的概念和功能。正則表達(dá)式可以讓用戶(hù)通過(guò)使用一系列的特殊字符構(gòu)建匹配模式,然后把匹配模式與數(shù)據(jù)文件、程序輸入以及WEB頁(yè)面的表單輸入等目標(biāo)對(duì)象進(jìn)行比較,根據(jù)比較對(duì)象中是否包含匹配模式,執(zhí)行相應(yīng)的程序。舉例來(lái)說(shuō),正則表達(dá)式的一個(gè)最為普遍的應(yīng)用就是用于驗(yàn)證用戶(hù)在線輸入的郵件地址的格式是否正確。如果通過(guò)正則表達(dá)式驗(yàn)證用戶(hù)郵件地址的格式正確,用戶(hù)所填寫(xiě)的表單信息將會(huì)被正常處理;反之,如果用戶(hù)輸入的郵件地址與正則表達(dá)的模式不匹配,將會(huì)彈出提示信息,要求用戶(hù)重新輸入正確的郵件地址。由此可見(jiàn)正則表達(dá)式在WEB應(yīng)用的邏輯判斷中具有舉足輕重的作用。正則表達(dá)式起源正則表達(dá)式的“祖先”可以一直上溯至對(duì)人類(lèi)神經(jīng)系統(tǒng)如何工作的早期研究。WarrenMcCulloch和WalterPitts這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來(lái)描述這些神經(jīng)網(wǎng)絡(luò)。1956年,一位叫StephenKleene的數(shù)學(xué)家在McCulloch和Pitts早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為“神經(jīng)網(wǎng)事件的表示法”的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來(lái)描述他稱(chēng)為“正則集的代數(shù)”的表達(dá)式,因此采用“正則表達(dá)式”這個(gè)術(shù)語(yǔ)。什么是正則表達(dá)式正則表達(dá)式(regularexpression)描述了一種字符串匹配的模式,可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串做替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。列目錄時(shí),dir*.txt或ls*.txt中的*.txt就不是一個(gè)正則表達(dá)式,因?yàn)檫@里*與正則式的*的含義是不同的。正則表達(dá)式是由普通字符(例如字符a到z)以及特殊字符(稱(chēng)為元字符)組成的文字模式。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。范例講解正則表達(dá)式是比較抽象的,如:“(19|20)(\d{2})-(\d{1,2})-(\d{1,2})”代表什么呢?如果不是很清楚,那也沒(méi)關(guān)系,我們下面一步步地認(rèn)識(shí)了解正則表達(dá)式,希望學(xué)完這一節(jié),大家能夠很輕松地了解上述表達(dá)式的意思。首先,讓我們看看兩個(gè)特別的字符:’^’和‘$’他們是分別用來(lái)匹配字符串的開(kāi)始和結(jié)束,一下分別舉例說(shuō)明
"^The":匹配以"The"開(kāi)頭的字符串;"ofdespair$":匹配以"ofdespair"結(jié)尾的字符串;"^abc$":匹配以abc開(kāi)頭和以abc結(jié)尾的字符串,實(shí)際上是只有abc與之匹配"notice":匹配包含notice的字符串例:<?php$string="TheDog";$pattern="^The";if(ereg($pattern,$string)){ print"Ture";}else print"Flase";
?>結(jié)果是:Ture
"ab*":匹配字符串a(chǎn)和0個(gè)或者更多b組成的字符串("a","ab","abbb",etc.);"ab+":和上面一樣,但最少有一個(gè)b("ab","abbb",etc.);"ab?":匹配0個(gè)或者一個(gè)b;"a?b+$":匹配以一個(gè)或者0個(gè)a再加上一個(gè)以上的b結(jié)尾的字符串.
你也可以在大括號(hào)里面限制字符出現(xiàn)的個(gè)數(shù),比如
"ab{2}":匹配一個(gè)a后面跟兩個(gè)b(一個(gè)也不能少)("abb");"ab{2,}":最少更兩個(gè)b("abb","abbbb",etc.);"ab{3,5}":2-5個(gè)b("abbb","abbbb",or"abbbbb").
請(qǐng)注意大括號(hào)的使用規(guī)則是"{0,2}",不是"{,2}"),也就是必須指定起始數(shù)。另外,你可能注意到,'*','+',和'?'分別和一下三個(gè)范圍標(biāo)注是一樣的,"{0,}","{1,}",和"{0,1}"。現(xiàn)在把一定數(shù)量的字符放到小括號(hào)里,比如:
"a(bc)*":匹配a后面跟0個(gè)或者一個(gè)"bc";"a(bc){1,5}":一個(gè)到5個(gè)"bc"
還有一個(gè)字符'│',相當(dāng)于OR操作:"hi│hello":匹配含有"hi"或者"hello"的字符串;"(b│cd)ef":匹配含有"bef"或者"cdef"的字符串;"(a│b)*c":匹配含有這樣-多個(gè)(包括0個(gè))a或b,后面跟一個(gè)c的字符串的字符串;
一個(gè)點(diǎn)('.')可以代表所有的單一字符:"a.[0-9]":一個(gè)a跟一個(gè)字符再跟一個(gè)數(shù)字的(含有這樣一個(gè)字符串的字符串將被匹配,以后省略此括號(hào))"^.{3}$":以三個(gè)字符結(jié)尾.中括號(hào)括住的內(nèi)容只匹配一個(gè)單一的字符"[ab]":匹配單個(gè)的a或者b(和"a│b"一樣);"[a-d]":匹配'a'到'd'的單個(gè)字符(和"a│b│c│d"還有"[abcd]"效果一樣);"^[a-zA-Z]":匹配以字母開(kāi)頭的字符串"[0-9]%":匹配含有形如x%的字符串",[a-zA-Z0-9]$":匹配以逗號(hào)在加一個(gè)數(shù)字或字母結(jié)尾的字符串你也可以把你不想要得字符列在中括號(hào)里,你只需要在總括號(hào)里面使用'^'作為開(kāi)頭(i.e.,"%[^a-zA-Z]%"匹配含有兩個(gè)百分號(hào)里面有一個(gè)非字母的字符串).
如何構(gòu)建一個(gè)模式來(lái)匹配貨幣數(shù)量的輸入好了,現(xiàn)在我們要用我們所學(xué)的來(lái)干一些有用的事:構(gòu)建一個(gè)匹配模式去檢查輸入的信息是否為一個(gè)表示money的數(shù)字。我們認(rèn)為一個(gè)表示money的數(shù)量有四種方式:"10000.00"和"10,000.00",或者沒(méi)有小數(shù)部分,"10000"and"10,000".現(xiàn)在讓我們開(kāi)始構(gòu)建這個(gè)匹配模式:^[1-9][0-9]*$這是所變量必須以非0的數(shù)字開(kāi)頭.但這也意味著單一的"0"也不能通過(guò)測(cè)試.以下是解決的方法:^(0│[1-9][0-9]*)$"只有0和不以0開(kāi)頭的數(shù)字與之匹配",我們也可以允許一個(gè)負(fù)號(hào)再數(shù)字之前:^(0│-?[1-9][0-9]*)$這就是:"0或者一個(gè)以0開(kāi)頭可能有一個(gè)負(fù)號(hào)在前面的數(shù)字."好了,好了現(xiàn)在讓我們別那么嚴(yán)謹(jǐn),允許以0開(kāi)頭.現(xiàn)在讓我們放棄負(fù)號(hào),因?yàn)槲覀冊(cè)诒硎惧X(qián)幣的時(shí)候并不需要用到.我們現(xiàn)在指定模式用來(lái)匹配小數(shù)部分:^[0-9]+(.[0-9]+)?$這暗示匹配的字符串必須最少以一個(gè)阿拉伯?dāng)?shù)字開(kāi)頭.但是注意,在上面模式中"10."是不匹配的,只有"10"和"10.2"才可以.(你知道為什么嗎)^[0-9]+(.[0-9]{2})?$我們上面指定小數(shù)點(diǎn)后面必須有兩位小數(shù).如果你認(rèn)為這樣太苛刻,你可以改成:^[0-9]+(.[0-9]{1,2})?$這將允許小數(shù)點(diǎn)后面有一到兩個(gè)字符.現(xiàn)在我們加上用來(lái)增加可讀性的逗號(hào)(每隔三位),我們可以這樣表示:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$不要忘記加號(hào)'+'可以被乘號(hào)'*'替代如果你想允許空白字符串被輸入話(為什么?).也不要忘記反斜桿’’在php字符串中可能會(huì)出現(xiàn)錯(cuò)誤(很普遍的錯(cuò)誤).現(xiàn)在,我們已經(jīng)可以確認(rèn)字符串了,我們現(xiàn)在把所有逗號(hào)都去掉str_replace(",","",$money)然后在把類(lèi)型看成double然后我們就可以通過(guò)他做數(shù)學(xué)計(jì)算了.構(gòu)造檢查email的正則表達(dá)式好,讓我們繼續(xù)討論怎么驗(yàn)證一個(gè)email地址.在一個(gè)完整的email地址中有三個(gè)部分:POP3用戶(hù)名(在'@'左邊的一切),'@',服務(wù)器名(就是剩下那部分).用戶(hù)名可以含有大小寫(xiě)字母阿拉伯?dāng)?shù)字,句號(hào)('.'),減號(hào)('-'),and下劃線('_').服務(wù)器名字也是符合這個(gè)規(guī)則,當(dāng)然下劃線除外.現(xiàn)在,用戶(hù)名的開(kāi)始和結(jié)束都不能是句點(diǎn).服務(wù)器也是這樣.還有你不能有兩個(gè)連續(xù)的句點(diǎn)他們之間至少存在一個(gè)字符,好現(xiàn)在我們來(lái)看一下怎么為用戶(hù)名寫(xiě)一個(gè)匹配模式:^[_a-zA-Z0-9-]+$現(xiàn)在還不能允許句號(hào)的存在.我們把它加上:^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$上面的意思就是說(shuō):"以至少一個(gè)規(guī)范字符(除.以外)開(kāi)頭,后面跟著0個(gè)或者多個(gè)以點(diǎn)開(kāi)始的字符串."簡(jiǎn)單化一點(diǎn),我們可以用eregi()取代ereg().eregi()對(duì)大小寫(xiě)不敏感,我們就不需要指定兩個(gè)范圍"a-z"和"A-Z"–只需要指定一個(gè)就可以了:^[_a-z0-9-]+(.[_a-z0-9-]+)*$后面的服務(wù)器名字也是一樣,但要去掉下劃線:^[a-z0-9-]+(.[a-z0-9-]+)*$
現(xiàn)在只需要用”@”把兩部分連接:^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$
這就是完整的email認(rèn)證匹配模式了,只需要調(diào)用eregi(‘^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$’,$eamil)就可以得到是否為email了PHP中使用正則表達(dá)式的函數(shù)1.用正則表達(dá)式查找子字符串:查找字符串是正則表達(dá)式的主要應(yīng)用,在PHP中,ereg();eregi();preg_match();preg_match_all()。ereg()與eregi()函數(shù)搜索字符串search,在pattern中尋找與正則表達(dá)式相匹配的字符串,如果發(fā)現(xiàn)了與pattern的子表達(dá)式相匹配的字符串,這些字符串將會(huì)存儲(chǔ)在數(shù)組matches中,每個(gè)數(shù)組元素對(duì)應(yīng)一個(gè)子表達(dá)式。(函數(shù)eregi()除了不區(qū)分大小寫(xiě)外,其它功能與ereg()一樣)以下代碼片斷接受ISO格式的日期(YYYY-MM-DD)然后以DD.MM.YYYY格式顯示:<?phpif(ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})",$date,$regs)){echo"$regs[3].$regs[2].$regs[1]";}else{echo"Invaliddateformat:$date";}?>preg_match()與preg_match_all()區(qū)別.preg_match()返回pattern所匹配的次數(shù)。要么是0次(沒(méi)有匹配)或1次,因?yàn)閜reg_match()在第一次匹配之后將停止搜索。preg_match_all()則相反,會(huì)一直搜索到subject的結(jié)尾處。如果出錯(cuò)preg_match()返回FALSE。例:從URL中取出域名<?php//從URL中取得主機(jī)名preg_match("/^(http:\/\/)?([^\/]+)/i","/index.html",$matches);$host=$matches[2];
//從主機(jī)名中取得后面兩段preg_match("/[^\.\/]+\.[^\.\/]+$/",$host,$matches);echo"domainnameis:{$matches[0]}\n";?>本例將輸出:domainnameis:2.使用正則表達(dá)式替換字符串:ereg_replace()和eregi_replace();preg_replace();函數(shù)ereg_replace()和eregi_replace()在字符串seach中查找正則表達(dá)式pattern的字符串,并且用字符串replacement來(lái)替換.eregi_replace()不區(qū)分大小寫(xiě)<?php$patterns=array("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/","/^\s*{(\w+)}\s*=/");$replace=array("\\3/\\4/\\1\\2","$\\1=");printpreg_replace($patterns,$replace,"{startDate}=1999-5-27");?>本例將輸出:$startDate=5/27/19993.使用正則表達(dá)式分割字符串函數(shù)是split();spliti();preg_split();preg_spliti();例:split()/spliti()<?php//分隔符可以是斜線,點(diǎn),或橫線$date="04/30/1973";list($month,$day,$year)=split('[/.-]',$date);echo"Month:$month;Day:$day;Year:$year<br/>\n";?>例:preg_split()/preg_spliti()<?php$str='hypertextlanguageprogramming';$chars=preg_split('//',$str,-1,PREG_SPLIT_OFFSET_CAPTURE);print_r($chars);?>將輸出:Array([0]=>Array([0]=>hypertext[1]=>0)
[1]=>Array([0]=>language[1]=>10)
[2]=>Array([0]=>programming[1]=>19)
)常用表達(dá)式"^\d+$"http://非負(fù)整數(shù)(正整數(shù)+0)"^[0-9]*[1-9][0-9]*$"http://正整數(shù)"^((-\d+)|(0+))$"http://非正整數(shù)(負(fù)整數(shù)+0)"^-[0-9]*[1-9][0-9]*$"http://負(fù)整數(shù)"^-?\d+$"http://整數(shù)"^\d+(\.\d+)?$"http://非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù)+0)"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"http://正浮點(diǎn)數(shù)"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"http://非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù)+0)"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"http://負(fù)浮點(diǎn)數(shù)"^(-?\d+)(\.\d+)?$"http://浮點(diǎn)數(shù)"^[A-Za-z]+$"http://由26個(gè)英文字母組成的字符串"^[A-Z]+$"http://由26個(gè)英文字母的大寫(xiě)組成的字符串"^[a-z]+$"http://由26個(gè)英文字母的小寫(xiě)組成的字符串"^[A-Za-z0-9]+$"http://由數(shù)字和26個(gè)英文字母組成的字符串"^\w+$"http://由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"http://email地址"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"http://url/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$///年-月-日/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$///月/日/年"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"http://Emil/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$///電話號(hào)碼"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"http://IP地址
匹配中文字符的正則表達(dá)式:[\u4e00-\u9fa5]匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]匹配空行的正則表達(dá)式:\n[\s|]*\r匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*<\/\1>|<(.*)\/>/匹配首尾空格的正則表達(dá)式:(^\s*)|(\s*$)匹配Email地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*匹配網(wǎng)址URL的正則表達(dá)式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$匹配帳號(hào)是否合法(字母開(kāi)頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$匹配國(guó)內(nèi)電話號(hào)碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?匹配騰訊QQ號(hào):^[1-9]*[1-9][0-9]*$基本語(yǔ)法元字符正則表達(dá)式的威力在于其能夠在模式中包含選擇和循環(huán)。它們通過(guò)使用元字符來(lái)編碼在模式中,元字符不代表其自身,它們用一些特殊的方式來(lái)解析。有兩組不同的元字符:一種是模式中除了方括號(hào)內(nèi)都能被識(shí)別的,還有一種是在方括號(hào)內(nèi)被識(shí)別的。方括號(hào)之外的元字符有這些:
\有數(shù)種用途的通用轉(zhuǎn)義符^斷言目標(biāo)的開(kāi)頭(或在多行模式下行的開(kāi)頭,即緊隨一換行符之后)$斷言目標(biāo)的結(jié)尾(或在多行模式下行的結(jié)尾,即緊隨一換行符之前).匹配除了換行符外的任意一個(gè)字符(默認(rèn)情況下)[字符類(lèi)定義開(kāi)始]字符類(lèi)定義結(jié)束|開(kāi)始一個(gè)多選一的分支(子模式開(kāi)始)子模式結(jié)束?擴(kuò)展(的含義,也是0或1數(shù)量限定符,以及數(shù)量限定符最小值匹配0個(gè)或多個(gè)的數(shù)量限定符+匹配1個(gè)或多個(gè)的數(shù)量限定符{最少/最多數(shù)量限定開(kāi)始}最少/最多數(shù)量限定結(jié)束模式中方括號(hào)內(nèi)的部分稱(chēng)為“字符類(lèi)”。字符類(lèi)中可用的元字符為:\通用轉(zhuǎn)義字符^排除字符類(lèi),但僅當(dāng)其為第一個(gè)字符時(shí)有效-指出字符范圍]結(jié)束字符類(lèi)反斜線(\)反斜線字符有幾種用途。首先,如果其后跟著一個(gè)非字母數(shù)字字符,則取消該字符可能具有的任何特殊含義。此種將反斜線用作轉(zhuǎn)義字符的用法適用于無(wú)論是字符類(lèi)之中還是之外。例如,如果想匹配一個(gè)“*”字符,則在模式中用“\*”。這適用于無(wú)論下一個(gè)字符是否會(huì)被當(dāng)作元字符來(lái)解釋?zhuān)虼嗽诜亲帜笖?shù)字字符之前加上一個(gè)“\”來(lái)指明該字符就代表其本身總是安全的。尤其是,如果要匹配一個(gè)反斜線,用“\\”。反斜線的第二種用途提供了一種在模式中以可見(jiàn)方式去編碼不可打印字符的方法。并沒(méi)有不可打印字符出現(xiàn)的限制,除了代表模式結(jié)束的二進(jìn)制零以外。但用文本編輯器來(lái)準(zhǔn)備模式的時(shí)候,通常用以下的轉(zhuǎn)義序列來(lái)表示那些二進(jìn)制字符更容易一些:\aalarm,即BEL字符(0x07)\cx"control-x",其中x是任意字符\eescape(0x1B)\f換頁(yè)符formfeed(0x0C)\n換行符newline(0x0A)\r回車(chē)符carriagereturn(0x0D)\t制表符tab(0x09)\xhh十六進(jìn)制代碼為hh的字符\ddd八進(jìn)制代碼為ddd的字符,或backreference
“\cx”的精確效果如下:如果“x”是小寫(xiě)字母,則被轉(zhuǎn)換為大寫(xiě)字母。接著字符中的第6位(0x40)被反轉(zhuǎn)。從而“\cz”成為0x1A,但“\c{”成為0x3B,而“\c;”成為0x7B。在“\x”之后最多再讀取兩個(gè)十六進(jìn)制數(shù)字(其中的字母可以是大寫(xiě)或小寫(xiě))。在UTF-8模式下,允許用“\x{...}”,花括號(hào)中的內(nèi)容是表示十六進(jìn)制數(shù)字的字符串。原來(lái)的十六進(jìn)制轉(zhuǎn)義序列\(zhòng)xhh如果其值大于127的話則匹配了一個(gè)雙字節(jié)UTF-8字符。在“\0”之后最多再讀取兩個(gè)八進(jìn)制數(shù)字。以上兩種情況下,如果少于兩個(gè)數(shù)字,則只使用已出現(xiàn)的。因此序列“\0\x\07”代表兩個(gè)二進(jìn)制的零加一個(gè)BEL字符。如果是八進(jìn)制數(shù)字則確保在開(kāi)始的零后面再提供兩個(gè)數(shù)字。處理反斜線后面跟著一個(gè)不是0的數(shù)字比較復(fù)雜。在字符類(lèi)之外,PCRE以十進(jìn)制數(shù)字讀取該數(shù)字及其后面的數(shù)字。如果數(shù)字小于10,或者之前表達(dá)式中捕獲到至少該數(shù)字的左圓括號(hào),則這個(gè)序列將被作為逆向引用。有關(guān)此如何運(yùn)作的說(shuō)明在后面,以及括號(hào)內(nèi)的子模式。在字符類(lèi)之中,或者如果十進(jìn)制數(shù)字大于9并且之前沒(méi)有那么多捕獲的子模式,PCRE重新從反斜線開(kāi)始讀取其后的最多三個(gè)八進(jìn)制數(shù)字,并以最低位的8個(gè)比特產(chǎn)生出一個(gè)單一字節(jié)。任何其后的數(shù)字都代表自身。例如:\040另一種表示空格的方法\40同上,如果之前捕獲的子模式少于40個(gè)的話\7總是一個(gè)逆向引用\11可能是個(gè)逆向引用,或者是制表符tab\011總是表示制表符tab\0113表示制表符tab后面跟著一個(gè)字符“3”\113表示八進(jìn)制代碼為113的字符(因?yàn)椴荒艹^(guò)99個(gè)逆向引用)\377表示一個(gè)所有的比特都是1的字節(jié)\81要么是一個(gè)逆向引用,要么是一個(gè)二進(jìn)制的零后面跟著兩個(gè)字符“8”和“1”
注意八進(jìn)制值100或更大的值之前不能以零打頭,因?yàn)椴粫?huì)讀?。ǚ葱本€后)超過(guò)三個(gè)八進(jìn)制數(shù)字。所有的定義了一個(gè)單一字節(jié)的序列可以用于字符類(lèi)之中或之外。此外,在字符類(lèi)之中,序列“\b”被解釋為反斜線字符(0x08),而在字符類(lèi)之外有不同含義(見(jiàn)下面)。反斜線的第三個(gè)用法是指定通用字符類(lèi)型:\d任一十進(jìn)制數(shù)字\D任一非十進(jìn)制數(shù)的字符\s任一空白字符\S任一非空白字符\w任一“字”的字符\W任一“非字”的字符
任何一個(gè)轉(zhuǎn)義序列將完整的字符組合分割成兩個(gè)分離的部分。任一給定的字符匹配一個(gè)且僅一個(gè)轉(zhuǎn)義序列?!白帧钡淖址侵溉魏我粋€(gè)字母或數(shù)字或下劃線,也就是說(shuō),任何可以是Perl"word"的字符。字母和數(shù)字的定義由PCRE字符表控制,可能會(huì)根據(jù)指定區(qū)域的匹配而改變(見(jiàn)上面的“區(qū)域支持”)。舉例說(shuō),在"fr"(French)區(qū)域,某些編碼大于128的字符用來(lái)表示重音字母,這些字符能夠被\w所匹配。這些字符類(lèi)型序列可以出現(xiàn)在字符類(lèi)之中和之外。每一個(gè)匹配相應(yīng)類(lèi)型中的一個(gè)字符。如果當(dāng)前匹配點(diǎn)在目標(biāo)字符串的結(jié)尾,以上所有匹配都失敗,因?yàn)闆](méi)有字符可供匹配。反斜線的第四個(gè)用法是某些簡(jiǎn)單的斷言。斷言是指在一個(gè)匹配中的特定位置必須達(dá)到的條件,并不會(huì)消耗目標(biāo)字符串中的任何字符。子模式中更復(fù)雜的斷言的用法在下面描述。反斜線的斷言有:\b字分界線\B非字分界線\A目標(biāo)的開(kāi)頭(獨(dú)立于多行模式)\Z目標(biāo)的結(jié)尾或位于結(jié)尾的換行符前(獨(dú)立于多行模式)\z目標(biāo)的結(jié)尾(獨(dú)立于多行模式)\G目標(biāo)中的第一個(gè)匹配位置模式修正符下面列出了當(dāng)前在PCRE中可能使用的修正符。括號(hào)中是這些修正符的內(nèi)部PCRE名。修正符中的空格和換行被忽略,其它字符會(huì)導(dǎo)致錯(cuò)誤。i(PCRE_CASELESS)如果設(shè)定此修正符,模式中的字符將同時(shí)匹配大小寫(xiě)字母。m(PCRE_MULTILINE)默認(rèn)情況下,PCRE將目標(biāo)字符串作為單一的一“行”字符所組成的(甚至其中包含有換行符也是如此)?!靶衅鹗肌痹址╚)僅僅匹配字符串的起始,“行結(jié)束”元字符($)僅僅匹配字符串的結(jié)束,或者最后一個(gè)字符是換行符時(shí)其前面(除非設(shè)定了D修正符)。這和Perl是一樣的。當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開(kāi)頭和結(jié)束外,還分別匹配其中的換行符的之后和之前。這和Perl的/m修正符是等效的。如果目標(biāo)字符串中沒(méi)有“\n”字符或者模式中沒(méi)有^或$,則設(shè)定此修正符沒(méi)有任何效果。s(PCRE_DOTALL)如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒(méi)有此設(shè)定的話,則不包括換行符。這和Perl的/s修正符是等效的。排除字符類(lèi)例如[^a]總是匹配換行符的,無(wú)論是否設(shè)定了此修正符。x(PCRE_EXTENDED)如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類(lèi)中的以外完全被忽略,在未轉(zhuǎn)義的字符類(lèi)之外的#以及下一個(gè)換行符之間的所有字符,包括兩頭,也都被忽略。這和Perl的/x修正符是等效的,使得可以在復(fù)雜的模式中加入注釋。然而注意,這僅適用于數(shù)據(jù)字符。空白字符可能永遠(yuǎn)不會(huì)出現(xiàn)于
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 銷(xiāo)售合同分期付款
- 多地多領(lǐng)域戰(zhàn)略合作協(xié)議
- 廣西藝術(shù)學(xué)院《數(shù)學(xué)建模與數(shù)學(xué)方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東生態(tài)工程職業(yè)學(xué)院《矩陣論》2023-2024學(xué)年第二學(xué)期期末試卷
- 租賃運(yùn)輸車(chē)輛合同
- 華東交通大學(xué)《實(shí)變函數(shù)一》2023-2024學(xué)年第二學(xué)期期末試卷
- 公司職員聘用合同范本
- 應(yīng)急預(yù)案的術(shù)后跟蹤與評(píng)估
- 應(yīng)急預(yù)案的應(yīng)急疏導(dǎo)與引導(dǎo)
- 應(yīng)急預(yù)案演練與復(fù)盤(pán)
- 2025年中國(guó)銅畫(huà)市場(chǎng)調(diào)查研究報(bào)告
- 山西省太原市2024-2025學(xué)年九年級(jí)上學(xué)期期末歷史試題(含答案)
- 2024年全國(guó)體育專(zhuān)業(yè)單獨(dú)招生考試數(shù)學(xué)試卷試題真題(含答案)
- 2025屆高三八省聯(lián)考語(yǔ)文試卷分析 課件
- 2025年度檢修計(jì)劃
- 2024-2025學(xué)年冀教版數(shù)學(xué)五年級(jí)上冊(cè)期末測(cè)試卷(含答案)
- 商業(yè)綜合體市場(chǎng)調(diào)研報(bào)告
- 資源枯竭型城市的轉(zhuǎn)型發(fā)展 課件 2024-2025學(xué)年高二上學(xué)期地理人教版選擇性必修2
- 2025屆河北省衡水市衡水中學(xué)高考仿真模擬英語(yǔ)試卷含解析
- 天津市部分區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 生物 含解析
- 變壓器投標(biāo)書(shū)-技術(shù)部分
評(píng)論
0/150
提交評(píng)論