![正則表達式語法.doc_第1頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/10/3225c432-77e8-418b-808d-3438f101e031/3225c432-77e8-418b-808d-3438f101e0311.gif)
![正則表達式語法.doc_第2頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/10/3225c432-77e8-418b-808d-3438f101e031/3225c432-77e8-418b-808d-3438f101e0312.gif)
![正則表達式語法.doc_第3頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/10/3225c432-77e8-418b-808d-3438f101e031/3225c432-77e8-418b-808d-3438f101e0313.gif)
![正則表達式語法.doc_第4頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/10/3225c432-77e8-418b-808d-3438f101e031/3225c432-77e8-418b-808d-3438f101e0314.gif)
![正則表達式語法.doc_第5頁](http://file1.renrendoc.com/fileroot_temp2/2020-3/10/3225c432-77e8-418b-808d-3438f101e031/3225c432-77e8-418b-808d-3438f101e0315.gif)
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
創(chuàng)建一個正則表達式第一種方法:var reg = /pattern/;第二種方法:var reg = new RegExp(pattern);正則表達式的exec方法簡介語法:reg.exec(str);其中str為要執(zhí)行正則表達式的目標(biāo)字符串。例如:var reg = /test/;var str = testString;var result = reg.exec(str);alert(result);將會輸出test,因為正則表達式reg會匹配str(testString)中的test子字符串,并且將其返回。我們使用下面的函數(shù)來做匹配正則的練習(xí):function execReg(reg,str) var result = reg.exec(str); alert(result);函數(shù)接受一個正則表達式參數(shù)reg和一個目標(biāo)字符串參數(shù)str,執(zhí)行之后會alert出正則表達式與字符串的匹配結(jié)果。用這個函數(shù)測試上面的例子就是:function execReg(reg,str) var result = reg.exec(str); alert(result);var reg = /test/;var str = testString;execReg(reg,str);上面的例子用正則里的test去匹配字符串里的test,實在是很無聊,同樣的任務(wù)用indexOf方法就可以完成了。用正則,自然是要完成更強大的功能:一片兩片三四片,落盡正則全不見上面的小標(biāo)題翻譯成正則就是1,2,3,4,1,。cn1表示一個的意思。/c1/只能匹配一個c。/c2/則會匹配兩個連續(xù)的c。以此類推,/cn/則會匹配n個連續(xù)的c??聪旅娴睦樱簉eg = /c1/;str=cainiao;execReg(reg,str);返回結(jié)果creg = /c2/;str=cainiao;execReg(reg,str);返回結(jié)果null,表示沒有匹配成功。reg = /c2/;str=ccVC果凍爽;execReg(reg,str);返回結(jié)果cc。cm,nc3,4的意思是,連續(xù)的3個c或者4個c。例如reg = /c3,4/;str=ccVC果凍爽;execReg(reg,str);返回結(jié)果null,表示沒有匹配成功。reg = /c3,4/;str=cccTest;execReg(reg,str);結(jié)果返回ccc。reg = /c3,4/;str=ccccTest;execReg(reg,str);結(jié)果返回cccc,這表明正則會盡量多品牌,可3可4的時候它會選擇多匹配一個。reg = /c3,4/;str=cccccTest;execReg(reg,str);仍然只匹配4個c。由以上例子可以推斷出,cm,n表示m個到n個c,且m小于等于,c1,表示1個以上的c。例如:reg = /c1,/;str=cainiao;execReg(reg,str);結(jié)果返回c。reg = /c1,/;str=cccccTest;execReg(reg,str);返回ccccc,再次說明了正則表達式會盡量多地匹配。reg = /c2,/;str=cainiao;execReg(reg,str);結(jié)果返回null,c2,表示2個以上的c,而cainiao中只有1個c。由以上例子可知,cn,表示最少n個c,最多則不限個數(shù)。*,+,?*表示0次或者多次,等同于0,,即c* 和 c0, 是一個意思。+表示一次或者多次,等同于1,,即c+ 和 c1, 是一個意思。最后,?表示0次或者1次,等同于0,1,即c? 和 c0,1 是一個意思。貪心與非貪心人都是貪婪的,正則也是如此。我們在例子reg = /c3,4/;str=ccccTest;的例子中已經(jīng)看到了,能匹配四個的時候,正則絕對不會去匹配三個。上面所介紹的所有的正則都是這樣,只要在合法的情況下,它們會盡量多去匹配字符,這就叫做貪心模式。如果我們希望正則盡量少地匹配字符,那么就可以在表示數(shù)字的符號后面加上一個?。組成如下的形式:n,?, *?, +?, ?, m,n?同樣來看一個例子:reg = /c1,?/;str=ccccc;execReg(reg,str);返回的結(jié)果只有1個c,盡管有5個c可以匹配,但是由于正則表達式是非貪心模式,所以只會匹配一個。/開頭,結(jié)尾$/表示只匹配字符串的開頭。看下面的例子:reg = /c/;str=維生素c;execReg(reg,str);結(jié)果為null,因為字符串維生素c的開頭并不是c,所以匹配失敗。reg = /c/;str=cainiao;execReg(reg,str);這次則返回c,匹配成功,因為cainiao恰恰是以c開頭的。與相反,$則只匹配字符串結(jié)尾的字符,同樣,看例子:reg = /c$/;str=cainiao;execReg(reg,str);返回null,表示正則表達式?jīng)]能在字符串的結(jié)尾找到c這個字符。reg = /c$/;str=維生素c;execReg(reg,str);這次返回的結(jié)果是c,表明匹配成功。點.會匹配字符串中除了換行符n之外的所有字符,例如reg = /./;str=cainiao;execReg(reg,str);結(jié)果顯示,正則匹配到了字符c。reg = /./;str=blueidea;execReg(reg,str);這次是b。reg = /.+/;str=blueidea經(jīng)典論壇 好_。;execReg(reg,str);結(jié)果是“blueidea經(jīng)典論壇 好_?!耙簿褪钦f所有的字符都被匹配掉了,包括一個空格,一個下滑線,和一個破折號。reg = /.+/;reg = /.+/;str=;execReg(reg,str);同樣,直接返回整個字符串,可見”.”也匹配”.”本身。reg = /./;str=ncainiao;execReg(reg,str);結(jié)果是null,終于失敗了,正則要求字符串的第一個字符不是換行,但是恰恰字符是以n開始的。二選一,正則表達式中的或,“|“b|c表示,匹配b或者c。例如:reg = /b|c/;str=blueidea;execReg(reg,str);結(jié)果是b。reg = /b|c/;str=cainiao;execReg(reg,str);結(jié)果是c。reg = /b|c.+/;str=cainiao;execReg(reg,str);匹配掉整個cainiao。reg = /b|c.+/;str=;execReg(reg,str);結(jié)果只有一個b,而不是整個字符串。因為上面正則表達式的意思是,匹配開頭的b或者是c.+。括號reg = /(b|c).+/;str=;execReg(reg,str);這次的結(jié)果是整個串,機上上面的括號這后,這個正則的意思是,如果字符串的開頭是b或者c,那么匹配開頭的b或者c以及其后的所有的非換行字符。如果你也實驗了的話,會發(fā)現(xiàn)返回的結(jié)果后面多出來一個“,b“,這是()內(nèi)的b|c所匹配的內(nèi)容。我們在正則表達式內(nèi)括號里寫的內(nèi)容會被認(rèn)為是子正則表達式,所匹配的結(jié)果也會被記錄下來供后面使用。我們暫且不去理會這個特性。字符集合abcabc表示a或者b或者c中的任意一個字符。例如:reg = /abc/;str=;execReg(reg,str);返回結(jié)果是b。reg = /abc/;str=test;execReg(reg,str);這次的結(jié)果就是null了。我們在字字符集合中使用如下的表示方式:a-z,A-Z,0-9,分別表示小寫字母,大寫字母,數(shù)字。例如:reg = /a-zA-Za-zA-Z0-9_+/;str=test;execReg(reg,str);結(jié)果是整個test,正則的意思是開頭必須是英文字母,后面可以是英文字母或者數(shù)字以及下劃線。反字符集合abc在正則表達式開始部分的時候表示開頭的意思,例如/c/表示開頭是c;但是在字符集和中,它表示的是類似“非“的意思,例如abc就表示不能是a,b或者c中的任何一個。例如:reg = /abc/;str=blueidea;execReg(reg,str);返回的結(jié)果是l,因為它是第一個非abc的字符(即第一個b沒有匹配)。同樣:reg = /abc/;str=cainiao;execReg(reg,str);則返回i,前兩個字符都是abc集合中的。由此我們可知:0-9表示非數(shù)字,a-z表示非小寫字母,一次類推。邊界與非邊界b表示的邊界的意思,也就是說,只有字符串的開頭和結(jié)尾才算數(shù)。例如/bc/就表示字符串開始的c或者是結(jié)尾的c。看下面的例子:reg = /bc/;str=cainiao;execReg(reg,str);返回結(jié)果c。匹配到了左邊界的c字符。reg = /bc/;str=維生素c;execReg(reg,str);仍然返回c,不過這次返回的是右側(cè)邊界的c。reg = /bc/;str=bcb;execReg(reg,str);這次匹配失敗,因為bcb字符串中的c被夾在中間,既不在左邊界也不再右邊界。與b對應(yīng)B表示非邊界。例如:reg = /Bc/;str=bcb;execReg(reg,str);這次會成功地匹配到bcb中的c,。然而reg = /Bc/;str=cainiao;execReg(reg,str);則會返回null。因為B告訴正則,只匹配非邊界的c。數(shù)字與非數(shù)字d表示數(shù)字的意思,相反,D表示非數(shù)字。例如:reg = /d/;str=cainiao8;execReg(reg,str);返回的匹配結(jié)果為8,因為它是第一個數(shù)字字符。reg = /D/;str=cainiao8;execReg(reg,str);返回c,第一個非數(shù)字字符。空白f匹配換頁符,n匹配換行符,r匹配回車,t匹配制表符,v匹配垂直制表符。s匹配單個空格,等同于fnrtv。例如:reg = /s.+/;str=This is a test String.;execReg(reg,str);返回“is a test String.”,正則的意思是匹配第一個空格以及其后的所有非換行字符。同樣,S表示非空格字符。reg = /S+/;str=This is a test String.;execReg(reg,str);匹配結(jié)果為This,當(dāng)遇到第一個空格之后,正則就停止匹配了。單詞字符w表示單詞字符,等同于字符集合a-zA-Z0-9_。例如:reg = /w+/;str=blueidea;execReg(reg,str);返回完整的blueidea字符串,因為所有字符都是單詞字符。reg = /w+/;str=.className;execReg(reg,str);結(jié)果顯示匹配了字符串中的className,只有第一個“.”唯一的非單詞字符沒有匹配。reg = /w+/;str=中文如何?;execReg(reg,str);試圖用單詞字符去匹配中文自然行不通了,返回null。W表示非單詞字符,等效于a-zA-Z0-9_reg = /W+/;str=中文如何?;execReg(reg,str);返回完整的字符串,因為,無論是中文和“?”都算作是非單詞字符。反向引用形式如下:/(子正則表達式)1/依舊用例子來說明:1.reg = /w/;str=blueidea;execReg(reg,str);返回b。2.reg = /(w)(w)/;str=blueidea;execReg(reg,str);返回bl,b,lbl是整個正則匹配的內(nèi)容,b是第一個括號里的子正則表達式匹配的內(nèi)容,l是第二個括號匹配的內(nèi)容。3.reg = /(w)1/;str=blueidea;execReg(reg,str);則會返回null。這里的“1”就叫做反向引用,它表示的是第一個括號內(nèi)的字正則表達式匹配的內(nèi)容。在上面的例子中,第一個括號里的(w)匹配了b,因此“1”就同樣表示b了,在余下的字符串里自然找不到b了。與第二個例子對比就可以發(fā)現(xiàn),“1”是等同于“第1個括號匹配的內(nèi)容”,而不是“第一個括號的內(nèi)容”。reg = /(w)1/;str=;execReg(reg,str);這個正則則會匹配到bb。同樣,前面有幾個子正則表達式我們就可以使用幾個反向引用。例如:reg = /(w)(w)21/;str=woow;execReg(reg,str);會匹配成功,因為第一個括號匹配到w,第二個括號匹配到o,而21則表示ow,恰好匹配了字符串的最后兩個字符。括號(2)前面我們曾經(jīng)討論過一次括號的問題,見下面這個例子:reg = /(b|c).+/;str=;execReg(reg,str);這個正則是為了實現(xiàn)只匹配以b或者c開頭的字符串,一直匹配到換行字符,但是。上面我們已經(jīng)看到了,可以使用“1”來反向引用這個括號里的子正則表達式所匹配的內(nèi)容。而且exec方法也會將這個字正則表達式的匹配結(jié)果保存到返回的結(jié)果中。不記錄子正則表達式的匹配結(jié)果使用形如(?:pattern)的正則就可以避免保存括號內(nèi)的匹配結(jié)果。例如:reg = /(?:b|c).+/;str=;execReg(reg,str);可以看到返回的結(jié)果不再包括那個括號內(nèi)的字正則表達式多匹配的內(nèi)容。同理,反向引用也不好使了:reg = /(b|c)1/;str=;execReg(reg,str);返回bb,b。bb是整個正則表達式匹配的內(nèi)容,而b是第一個子正則表達式匹配的內(nèi)容。reg = /(?:b|c)1/;str=;execReg(reg,str);返回null。由于根本就沒有記錄括號內(nèi)匹配的內(nèi)容,自然沒有辦法反向引用了。正向預(yù)查形式:(?=pattern)所謂正向預(yù)查,意思就是:要匹配的字符串,后面必須緊跟著pattern!我們知道正則表達式/cainiao/會匹配cainiao。同樣,也會匹配cainiao9中的cainiao。但是我們可能希望,cainiao只能匹配cainiao8中的菜鳥。這時候就可以像下面這樣寫:/cainiao(?=8)/,看兩個實例:reg = /cainiao(?=8)/;str=cainiao9;execReg(reg,str);返回null。reg = /cainiao(?=8)/;str=cainiao8;execReg(reg,str);匹配cainiao。需要注意的是,括號里的內(nèi)容并不參與真正的匹配,只是檢查一下后面的字符是否符合要求而已,例如上面的正則,返回的是cainiao,而不是cainiao8。再來看兩個例子:reg = /blue(?=idea)/;str=blueidea;execReg(reg,str);匹配到blue,而不是blueidea。reg = /blue(?=idea)/;str=bluetooth;execReg(reg,str);返回null,因為blue后面不是idea。reg = /blue(?=idea)/;str=bluetoothidea;execReg(reg,str);同樣返回null。?!形式(?!pattern)和?=恰好相反,要求字符串的后面不能緊跟著某個pattern,還拿上面的例子:reg = /blue(?!idea)/;str=blueidea;execReg(reg,str);返回null,因為正則要求,blue的后面不能是idea。reg = /blue(?!idea)/;str=bluetooth;execReg(reg,str);則成功返回blue。匹配元字符首先要搞清楚什么是元字符呢?我們之前用過*,+,?之類的符號,它們在正則表達式中都有一定的特殊含義,類似這些有特殊功能的字符都叫做元字符。例如reg = /c*/;表示有任意個c,但是如果我們真的想匹配c*這個字符串的時候怎么辦呢?只要將*轉(zhuǎn)義了就可以了,如下:reg = /c*/;str=c*;execReg(reg,str);返回匹配的字符串:c*。同理,要匹配其他元字符,只要在前面加上一個“”就可以了。正則表達式的修飾符全局匹配,修飾符g形式:/pattern/g例子:reg = /b/g;后面再說這個g的作用。先看后面的兩個修飾符。不區(qū)分大小寫,修飾符i形式:/pattern/i例子:var reg = /b/;var str = BBS;execReg(reg,str);返回null,因為大小寫不符合。var reg = /b/i;var str = BBS;execReg(reg,str);匹配到B,這個就是i修飾符的作用了。行首行尾,修飾符m形式:/pattern/mm修飾符的作用是修改和$在正則表達式中的作用,讓它們分別表示行首和行尾。例如:var reg = /b/;var str = testnbbs;execReg(reg,str);匹配失敗,因為字符串的開頭沒有b字符。但是加上m修飾符之后:var reg = /b/m;var str = testnbbs;execReg(reg,str);匹配到b,因為加了m修飾符之后,已經(jīng)表示行首,由于bbs在字符串第二行的行首,所以可以成功地匹配。exec方法詳解exec方法的返回值exec方法返回的其實并不是匹配結(jié)果字符串,而是一個對象,簡單地修改一下execReg函數(shù),來做一個實驗就可以印證這一點:function execReg(reg,str) var result = reg.exec(str); alert(typeof result);var reg = /b/;var str=;execReg(reg,str);結(jié)果顯示result的類型是object。而且是一個類似數(shù)組的對象。使用for in可以知道它的屬性: index input 0。其中index是表示匹配在原字符串中的索引;而input則是表示輸入的字符串;至于0則是表示只有一個匹配結(jié)果,可以用下標(biāo)0來引用這個匹配結(jié)果,這個數(shù)量可能改變。我們可以通過返回值的length屬性來得知匹配結(jié)果的總數(shù)量。根據(jù)以上對返回值的分析,修改execReg函數(shù)如下:function execReg(reg,str) var result = reg.exec(str); document.write(index:+result.index+ +input:+result.input+ ); for(i=0;iresult.length;i+) document.write(result+i+:+resulti+) 馬上來實驗一下:var reg = /w/;var str=;execReg(reg,str);結(jié)果如下: index:0 input: result0:b輸入字符串為;匹配的b在原字符串的索引是0。正則的匹配結(jié)果為一個,b;var reg = /(w)(w)(.+)/;var str=;execReg(reg,str);結(jié)果為:index:0input:result0:result1:bresult2:bresult3:由上面兩個例子可見,返回對象0就是整個正則表達式所匹配的內(nèi)容。后續(xù)的元素則是各個子正則表達式的匹配內(nèi)容。exec方法對正則表達式的更新exec方法在返回結(jié)果對象的同時,還可能會更新原來的正則表達式,這就要看正則表達式是否設(shè)置了g修飾符。先來看兩個例子吧:var reg = /b/;var str = ;execReg(reg,str);execReg(reg,str);結(jié)果如下:index:0input:result0:bindex:0input:result0:b也就是說,兩次匹配的結(jié)果完全一樣,從索引可以看出來,匹配的都是字符串首的b字符。下面看看設(shè)置了g的正則表達式表現(xiàn)如何:var reg = /b/g;var str = ;execReg(reg,str);execReg(reg,str);結(jié)果如下:index:0input:result0:bindex:1input:result0:b可以看得出來,第二次匹配的是字符串的字符串的第二個b。這也就是g修飾符的作用了,下面來看exec是如何區(qū)別對待g和非g正則表達式的。如果正則表達式?jīng)]有設(shè)置g,那么exec方法不會對正則表達式有任何的影響,如果設(shè)置了g,那么exec執(zhí)行之后會更新正則表達式的lastIndex屬性,表示本次匹配后,所匹配字符串的下一個字符的索引,下一次再用這個正則表達式匹配字符串的時候就會從上次的lastIndex屬性開始匹配,也就是上面兩個例子結(jié)果不同的原因了。test方法test方法僅僅檢查是否能夠匹配str,并且返回布爾值以表示是否成功。同樣建立一個簡單的測試函數(shù):function testReg(reg,str) alert(reg.test(str);實例1var reg = /b/;var str = ;testReg(reg,str);成功,輸出true。實例2var reg = /9/;var str = ;testReg(reg,str);失敗,返回false。使用字符串的方法執(zhí)行正則表達式match方法形式:str.match(reg);與正則表達式的exec方法類似,該方法同樣返回一個類似數(shù)組的對象,也有input和index屬性。我們定義如下一個函數(shù)用來測試:function matchReg(reg,str) var result = str.match(reg); if(result ) document.write(index:+result.index+ +input:+result.input+ ); for(i=0;iresult.length;i+) document.write(result+i+:+resulti+) else alert(null:匹配失?。? 例如:var reg = /b/;var str = ;matchReg(reg,str);結(jié)果如下:index:0input:result0:b可見,和exec的結(jié)果一樣。但是如果正則表達式設(shè)置了g修飾符,exec和match的行為可就不一樣了,見下例:index:undefinedinput:undefinedresult0:bresult1:bresult2:b設(shè)置了g修飾符的正則表達式在完成一次成功匹配后不會停止,而是繼續(xù)找到所有可以匹配到的字符。返回的結(jié)果包括了三個b。不過沒有提供input和index這些信息。replace方法形式:str. replace (reg,new str);它的作用是將str字符串中匹配reg的部分用new str”部分代碼,值得注意的是原字符串并不會被修改,而是作為返回值被返回。例子:var reg = /b/;var str = ;var newStr = str.replace(reg,c);document.write(newStr);結(jié)果為,只有第一個b被替換為c。var reg = /b/g;var str = ;var newStr = str.replace(reg,c);document.write(newStr);輸出由于,設(shè)置了g修飾符,所以會替換掉所有的b。var reg = /w+/g;var str = ;var newStr = str.replace(reg,word);document.write(newStr);輸出:word.word.word。在replace函數(shù)中使用$引用子正則表達式匹配內(nèi)容就像在正則里我們可以使用1來引用第一個子正則表達式所匹配的內(nèi)容一樣,我們在replace函數(shù)的替換字符里也可以使用$1來引用相同的內(nèi)容。還是來看一個例子吧:var reg = /(w+).(w+).(w+)/;var str = bbs.blueidea.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同的保全與擔(dān)保
- 變壓器購買三方合同書
- 2024年文化傳播合作協(xié)議
- 設(shè)計委托合同模板協(xié)議
- 配電箱合同協(xié)議書
- 臨時施工用電合同
- 鋼材居間合同
- 測量工程分包合同范本
- 財政借款合同
- 燈桿廣告位租賃合同范本
- 中層領(lǐng)導(dǎo)的高績效管理
- 小小銀行家-兒童銀行知識、理財知識培訓(xùn)
- 物業(yè)公司縮減人員方案范本
- 機械基礎(chǔ)知識競賽題庫附答案(100題)
- 2022年上學(xué)期八年級期末考試數(shù)學(xué)試卷
- 閱讀理解特訓(xùn)卷-英語四年級上冊譯林版三起含答案
- 國庫集中支付培訓(xùn)班資料-國庫集中支付制度及業(yè)務(wù)操作教學(xué)課件
- 屋面及防水工程施工(第二版)PPT完整全套教學(xué)課件
- 2023年上海青浦區(qū)區(qū)管企業(yè)統(tǒng)一招考聘用筆試題庫含答案解析
- 2023年高一物理期末考試卷(人教版)
- 2023版押品考試題庫必考點含答案
評論
0/150
提交評論