久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

JavaScript正則表達(dá)式

 mfxie 2009-12-18

什么是正則表達(dá)式,?

這個(gè)問題可以參見:“正則表達(dá)式30分鐘入門教程”,很多編程語言都支持正則表達(dá)式,,本文僅僅討論JavaScript中的正則表達(dá)式。

創(chuàng)建一個(gè)正則表達(dá)式

第一種方法:

var reg = /pattern/;

第二種方法:

var reg = new  RegExp('pattern');

正則表達(dá)式的exec方法簡介

語法:

reg.exec(str);

其中str為要執(zhí)行正則表達(dá)式的目標(biāo)字符串。

例如:

<script  type="text/javascript">
var reg = /test/;
var str = 'testString';
var result =  reg.exec(str);
alert(result);
</script>

將會(huì)輸出test,因?yàn)檎齽t表達(dá)式reg會(huì)匹配str(‘testString’)中的’test’子字符串,并且將其返回。

我們使用下面的函數(shù)來做匹配正則的練習(xí):

function  execReg(reg,str){
var result =  reg.exec(str);
alert(result);
}

函數(shù)接受一個(gè)正則表達(dá)式參數(shù)reg和一個(gè)目標(biāo)字符串參數(shù)str,,執(zhí)行之后會(huì)alert出正則表達(dá)式與字符串的匹配結(jié)果,。

用這個(gè)函數(shù)測試上面的例子就是:

<script  type="text/javascript">
function  execReg(reg,str){
var result =  reg.exec(str);
alert(result);
}
var reg = /test/;
var str = 'testString';
execReg(reg,str);
</script>

上面的例子用正則里的test去匹配字符串里的test,實(shí)在是很無聊,,同樣的任務(wù)用indexOf方法就可以完成了,。用正則,自然是要完成更強(qiáng)大的功能:

一片兩片三四片,,落盡正則全不見

上面的小標(biāo)題翻譯成正則就是{1},{2},{3,4},{1,},。

c{n}

{1}表示一個(gè)的意思。

/c{1}/只能匹配一個(gè)c,。

/c{2}/則會(huì)匹配兩個(gè)連續(xù)的c,。

以此類推,

/c{n}/則會(huì)匹配n個(gè)連續(xù)的c。

看下面的例子:

reg = /c{1}/;
str='cainiao';
execReg(reg,str);

返回結(jié)果c

reg = /c{2}/;
str='cainiao';
execReg(reg,str);

返回結(jié)果null,,表示沒有匹配成功,。

reg = /c{2}/;
str='ccVC果凍爽';
execReg(reg,str);

返回結(jié)果cc。

c{m,n}

c{3,4}的意思是,,連續(xù)的3個(gè)c或者4個(gè)c,。

例如

reg = /c{3,4}/;
str='ccVC果凍爽';
execReg(reg,str);

返回結(jié)果null,表示沒有匹配成功,。

reg = /c{3,4}/;
str='cccTest';
execReg(reg,str);

結(jié)果返回ccc,。

reg = /c{3,4}/;
str='ccccTest';
execReg(reg,str);

結(jié)果返回cccc,這表明正則會(huì)盡量多品牌,,可3可4的時(shí)候它會(huì)選擇多匹配一個(gè),。

reg = /c{3,4}/;
str='cccccTest';
execReg(reg,str);

仍然只匹配4個(gè)c。

由以上例子可以推斷出,,c{m,n}表示m個(gè)到n個(gè)c,,且m小于等于n。

c{n,}

c{1,}表示1個(gè)以上的c,。例如:

reg = /c{1,}/;
str='cainiao';
execReg(reg,str);

結(jié)果返回c,。

reg = /c{1,}/;
str='cccccTest';
execReg(reg,str);

返回ccccc,再次說明了正則表達(dá)式會(huì)盡量多地匹配,。

reg = /c{2,}/;
str='cainiao';
execReg(reg,str);

結(jié)果返回null,,c{2,}表示2個(gè)以上的c,而cainiao中只有1個(gè)c,。

由以上例子可知,,c{n,}表示最少n個(gè)c,最多則不限個(gè)數(shù),。

*,+,?

*表示0次或者多次,,等同于{0,},,即

c* 和 c{0,} 是一個(gè)意思。

+表示一次或者多次,,等同于{1,},,即

c+ 和 c{1,} 是一個(gè)意思。

最后,,?表示0次或者1次,,等同于{0,1},即

c? 和 c{0,1} 是一個(gè)意思,。

貪心與非貪心

人都是貪婪的,,正則也是如此。我們在例子reg = /c{3,4}/;str='ccccTest';的例子中已經(jīng)看到了,,能匹配四個(gè)的時(shí)候,,正則絕對(duì)不會(huì)去匹配三個(gè)。上面所介紹的所有的正則都是這樣,,只要在合法的情況下,,它們會(huì)盡量多去匹配字符,這就叫做貪心模式,。

如果我們希望正則盡量少地匹配字符,,那么就可以在表示數(shù)字的符號(hào)后面加上一個(gè)?。組成如下的形式:

{n,}?, *?, +?, ??, {m,n}?

同樣來看一個(gè)例子:

reg = /c{1,}?/;
str='ccccc';
execReg(reg,str);

返回的結(jié)果只有1個(gè)c,,盡管有5個(gè)c可以匹配,,但是由于正則表達(dá)式是非貪心模式,所以只會(huì)匹配一個(gè),。

/^開頭,結(jié)尾$/

^表示只匹配字符串的開頭,。看下面的例子:

reg = /^c/;
str='維生素c';
execReg(reg,str);

結(jié)果為null,,因?yàn)樽址?#8216;維生素c’的開頭并不是c,,所以匹配失敗。

reg = /^c/;
str='cainiao';
execReg(reg,str);

這次則返回c,,匹配成功,,因?yàn)閏ainiao恰恰是以c開頭的。

與^相反,,$則只匹配字符串結(jié)尾的字符,,同樣,看例子:

reg = /c$/;
str='cainiao';
execReg(reg,str);

返回null,,表示正則表達(dá)式?jīng)]能在字符串的結(jié)尾找到c這個(gè)字符,。

reg = /c$/;
str='維生素c';
execReg(reg,str);

這次返回的結(jié)果是c,表明匹配成功,。

點(diǎn)’.’

‘.’會(huì)匹配字符串中除了換行符\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)典論壇 好_。“也就是說所有的字符都被匹配掉了,,包括一個(gè)空格,一個(gè)下滑線,,和一個(gè)破折號(hào),。

reg = /.+/;
reg = /.+/;
str='bbs.blueidea.com';
execReg(reg,str);

同樣,直接返回整個(gè)字符串——bbs.blueidea.com,,可見”.”也匹配”.”本身,。

reg = /^./;
str='\ncainiao';
execReg(reg,str);

結(jié)果是null,終于失敗了,,正則要求字符串的第一個(gè)字符不是換行,,但是恰恰字符是以\n開始的。

二選一,,正則表達(dá)式中的或,,“|“

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);

匹配掉整個(gè)cainiao,。

reg = /^b|c.+/;
str='bbs.blueidea.com';
execReg(reg,str);

結(jié)果只有一個(gè)b,,而不是整個(gè)字符串。因?yàn)樯厦嬲齽t表達(dá)式的意思是,,匹配開頭的b或者是c.+,。

括號(hào)

reg = /^(b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);

這次的結(jié)果是整個(gè)串bbs.blueidea.com,機(jī)上上面的括號(hào)這后,,這個(gè)正則的意思是,,如果字符串的開頭是b或者c,那么匹配開頭的b或者c以及其后的所有的非換行字符,。

如果你也實(shí)驗(yàn)了的話,,會(huì)發(fā)現(xiàn)返回的結(jié)果后面多出來一個(gè)“,b“,這是()內(nèi)的b|c所匹配的內(nèi)容,。我們在正則表達(dá)式內(nèi)括號(hào)里寫的內(nèi)容會(huì)被認(rèn)為是子正則表達(dá)式,,所匹配的結(jié)果也會(huì)被記錄下來供后面使用。我們暫且不去理會(huì)這個(gè)特性,。

字符集合[abc]

[abc]表示a或者b或者c中的任意一個(gè)字符,。例如:

reg = /^[abc]/;
str='bbs.blueidea.com';
execReg(reg,str);

返回結(jié)果是b,。

reg = /^[abc]/;
str='test';
execReg(reg,str);

這次的結(jié)果就是null了。

我們在字字符集合中使用如下的表示方式:[a-z],[A-Z],[0-9],,分別表示小寫字母,,大寫字母,數(shù)字,。例如:

reg =  /^[a-zA-Z][a-zA-Z0-9_]+/;
str='test';
execReg(reg,str);

結(jié)果是整個(gè)test,,正則的意思是開頭必須是英文字母,后面可以是英文字母或者數(shù)字以及下劃線,。

反字符集合[^abc]

^在正則表達(dá)式開始部分的時(shí)候表示開頭的意思,,例如/^c/表示開頭是c;但是在字符集和中,,它表示的是類似“非“的意思,,例如[^abc]就表示不能是a,b或者c中的任何一個(gè),。例如:

reg = /[^abc]/;
str='blueidea';
execReg(reg,str);

返回的結(jié)果是l,,因?yàn)樗堑谝粋€(gè)非abc的字符(即第一個(gè)b沒有匹配)。同樣:

reg = /[^abc]/;
str='cainiao';
execReg(reg,str);

則返回i,,前兩個(gè)字符都是[abc]集合中的,。

由此我們可知:[^0-9]表示非數(shù)字,[^a-z]表示非小寫字母,,一次類推,。

邊界與非邊界

\b表示的邊界的意思,也就是說,,只有字符串的開頭和結(jié)尾才算數(shù),。例如/\bc/就表示字符串開始的c或者是結(jié)尾的c??聪旅娴睦樱?br>

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);

這次匹配失敗,因?yàn)閎cb字符串中的c被夾在中間,,既不在左邊界也不再右邊界,。

與\b對(duì)應(yīng)\B表示非邊界。例如:

reg = /\Bc/;
str='bcb';
execReg(reg,str);

這次會(huì)成功地匹配到bcb中的c,,,。然而

reg = /\Bc/;
str='cainiao';
execReg(reg,str);

則會(huì)返回null。因?yàn)閈B告訴正則,,只匹配非邊界的c,。

數(shù)字與非數(shù)字

\d表示數(shù)字的意思,,相反,\D表示非數(shù)字,。例如:

reg = /\d/;
str='cainiao8';
execReg(reg,str);

返回的匹配結(jié)果為8,,因?yàn)樗堑谝粋€(gè)數(shù)字字符。

reg = /\D/;
str='cainiao8';
execReg(reg,str);

返回c,,第一個(gè)非數(shù)字字符,。

空白

\f匹配換頁符,\n匹配換行符,,\r匹配回車,,\t匹配制表符,\v匹配垂直制表符,。

\s匹配單個(gè)空格,等同于[\f\n\r\t\v],。例如:

reg = /\s.+/;
str='This is a test  String.';
execReg(reg,str);

返回“is a test String.”,,正則的意思是匹配第一個(gè)空格以及其后的所有非換行字符。

同樣,,\S表示非空格字符,。

reg = /\S+/;
str='This is a test  String.';
execReg(reg,str);

匹配結(jié)果為This,當(dāng)遇到第一個(gè)空格之后,,正則就停止匹配了,。

單詞字符

\w表示單詞字符,等同于字符集合[a-zA-Z0-9_],。例如:

reg = /\w+/;
str='blueidea';
execReg(reg,str);

返回完整的blueidea字符串,,因?yàn)樗凶址际菃卧~字符。

reg = /\w+/;
str='.className';
execReg(reg,str);

結(jié)果顯示匹配了字符串中的className,,只有第一個(gè)“.”——唯一的非單詞字符沒有匹配,。

reg = /\w+/;
str='中文如何?';
execReg(reg,str);

試圖用單詞字符去匹配中文自然行不通了,,返回null,。

\W表示非單詞字符,等效于[^a-zA-Z0-9_]

reg = /\W+/;
str='中文如何,?';
execReg(reg,str);

返回完整的字符串,,因?yàn)椋瑹o論是中文和“,?”都算作是非單詞字符,。

反向引用

形式如下:/(子正則表達(dá)式)\1/

依舊用例子來說明:

1.

reg = /\w/;
str='blueidea';
execReg(reg,str);

返回b。

2.

reg = /(\w)(\w)/;
str='blueidea';
execReg(reg,str);

返回bl,b,l

bl是整個(gè)正則匹配的內(nèi)容,,b是第一個(gè)括號(hào)里的子正則表達(dá)式匹配的內(nèi)容,,l是第二個(gè)括號(hào)匹配的內(nèi)容,。

3.

reg = /(\w)\1/;
str='blueidea';
execReg(reg,str);

則會(huì)返回null。這里的“\1”就叫做反向引用,,它表示的是第一個(gè)括號(hào)內(nèi)的字正則表達(dá)式匹配的內(nèi)容,。在上面的例子中,第一個(gè)括號(hào)里的(\w)匹配了b,,因此“\1”就同樣表示b了,,在余下的字符串里自然找不到b了。

與第二個(gè)例子對(duì)比就可以發(fā)現(xiàn),,“\1”是等同于“第1個(gè)括號(hào)匹配的內(nèi)容”,,而不是“第一個(gè)括號(hào)的內(nèi)容”。

reg = /(\w)\1/;
str='bbs.blueidea.com';
execReg(reg,str);

這個(gè)正則則會(huì)匹配到bb,。

同樣,,前面有幾個(gè)子正則表達(dá)式我們就可以使用幾個(gè)反向引用。例如:

reg = /(\w)(\w)\2\1/;
str='woow';
execReg(reg,str);

會(huì)匹配成功,,因?yàn)榈谝粋€(gè)括號(hào)匹配到w,,第二個(gè)括號(hào)匹配到o,而\2\1則表示ow,,恰好匹配了字符串的最后兩個(gè)字符,。

括號(hào)(2)

前面我們曾經(jīng)討論過一次括號(hào)的問題,見下面這個(gè)例子:

reg = /^(b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);

這個(gè)正則是為了實(shí)現(xiàn)只匹配以b或者c開頭的字符串,,一直匹配到換行字符,,但是。上面我們已經(jīng)看到了,,可以使用“\1”來反向引用這個(gè)括號(hào)里的子正則表達(dá)式所匹配的內(nèi)容,。而且exec方法也會(huì)將這個(gè)字正則表達(dá)式的匹配結(jié)果保存到返回的結(jié)果中。

不記錄子正則表達(dá)式的匹配結(jié)果

使用形如(?:pattern)的正則就可以避免保存括號(hào)內(nèi)的匹配結(jié)果,。例如:

reg = /^(?:b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);

可以看到返回的結(jié)果不再包括那個(gè)括號(hào)內(nèi)的字正則表達(dá)式多匹配的內(nèi)容,。

同理,反向引用也不好使了:

reg = /^(b|c)\1/;
str='bbs.blueidea.com';
execReg(reg,str);

返回bb,b,。bb是整個(gè)正則表達(dá)式匹配的內(nèi)容,,而b是第一個(gè)子正則表達(dá)式匹配的內(nèi)容。

reg = /^(?:b|c)\1/;
str='bbs.blueidea.com';
execReg(reg,str);

返回null,。由于根本就沒有記錄括號(hào)內(nèi)匹配的內(nèi)容,,自然沒有辦法反向引用了。

正向預(yù)查

形式:(?=pattern)

所謂正向預(yù)查,,意思就是:要匹配的字符串,,后面必須緊跟著pattern!

我們知道正則表達(dá)式/cainiao/會(huì)匹配cainiao。同樣,,也會(huì)匹配cainiao9中的cainiao,。但是我們可能希望,cainiao只能匹配cainiao8中的菜鳥,。這時(shí)候就可以像下面這樣寫:/cainiao(?=8)/,,看兩個(gè)實(shí)例:

reg = /cainiao(?=8)/;
str='cainiao9';
execReg(reg,str);

返回null。

reg = /cainiao(?=8)/;
str='cainiao8';
execReg(reg,str);

匹配cainiao,。

需要注意的是,,括號(hào)里的內(nèi)容并不參與真正的匹配,只是檢查一下后面的字符是否符合要求而已,,例如上面的正則,,返回的是cainiao,而不是cainiao8,。

再來看兩個(gè)例子:

reg = /blue(?=idea)/;
str='blueidea';
execReg(reg,str);

匹配到blue,,而不是blueidea。

reg = /blue(?=idea)/;
str='bluetooth';
execReg(reg,str);

返回null,,因?yàn)閎lue后面不是idea,。

reg = /blue(?=idea)/;
str='bluetoothidea';
execReg(reg,str);

同樣返回null。

!

形式(?!pattern)和?=恰好相反,,要求字符串的后面不能緊跟著某個(gè)pattern,還拿上面的例子:

reg = /blue(?!idea)/;
str='blueidea';
execReg(reg,str);

返回null,,因?yàn)檎齽t要求,,blue的后面不能是idea。

reg = /blue(?!idea)/;
str='bluetooth';
execReg(reg,str);

則成功返回blue,。

匹配元字符

首先要搞清楚什么是元字符呢,?我們之前用過*,+,?之類的符號(hào),它們在正則表達(dá)式中都有一定的特殊含義,,類似這些有特殊功能的字符都叫做元字符,。例如

reg = /c*/;

表示有任意個(gè)c,但是如果我們真的想匹配’c*’這個(gè)字符串的時(shí)候怎么辦呢,?只要將*轉(zhuǎn)義了就可以了,,如下:

reg = /c\*/;
str='c*';
execReg(reg,str);

返回匹配的字符串:c*。

同理,,要匹配其他元字符,,只要在前面加上一個(gè)“\”就可以了。

正則表達(dá)式的修飾符

全局匹配,,修飾符g

形式:/pattern/g

例子:reg = /b/g;

后面再說這個(gè)g的作用,。先看后面的兩個(gè)修飾符。

不區(qū)分大小寫,修飾符i

形式:/pattern/i

例子:

var reg = /b/;
var str = 'BBS';
execReg(reg,str);

返回null,,因?yàn)榇笮懖环稀?br>

var reg = /b/i;
var str = 'BBS';
execReg(reg,str);

匹配到B,,這個(gè)就是i修飾符的作用了。

行首行尾,,修飾符m

形式:/pattern/m

m修飾符的作用是修改^和$在正則表達(dá)式中的作用,,讓它們分別表示行首和行尾。例如:

var reg = /^b/;
var str = 'test\nbbs';
execReg(reg,str);

匹配失敗,,因?yàn)樽址拈_頭沒有b字符,。但是加上m修飾符之后:

var reg = /^b/m;
var str = 'test\nbbs';
execReg(reg,str);

匹配到b,因?yàn)榧恿薽修飾符之后,,^已經(jīng)表示行首,,由于bbs在字符串第二行的行首,所以可以成功地匹配,。

exec方法詳解

exec方法的返回值

exec方法返回的其實(shí)并不是匹配結(jié)果字符串,,而是一個(gè)對(duì)象,簡單地修改一下execReg函數(shù),,來做一個(gè)實(shí)驗(yàn)就可以印證這一點(diǎn):

function  execReg(reg,str){
var result =  reg.exec(str);
alert(typeof result);
}
var reg = /b/;
var  str='bbs.bblueidea.com';
execReg(reg,str);

結(jié)果顯示result的類型是object,。而且是一個(gè)類似數(shù)組的對(duì)象。使用for in可以知道它的屬性: index input 0,。其中index是表示匹配在原字符串中的索引,;而input則是表示輸入的字符串;

至于0則是表示只有一個(gè)匹配結(jié)果,,可以用下標(biāo)0來引用這個(gè)匹配結(jié)果,,這個(gè)數(shù)量可能改變。我們可以通過返回值的length屬性來得知匹配結(jié)果的總數(shù)量,。

根據(jù)以上對(duì)返回值的分析,,修改execReg函數(shù)如下:

function  execReg(reg,str){
var result =  reg.exec(str);
document.write('index:'+result.index+'<br  />'
+'input:'+result.input+'<br  />'
);
for(i=0;i<result.length;i++){
document.write('result['+i+']:'+result[i]+'<br  />')
}
}

馬上來實(shí)驗(yàn)一下:

var reg = /\w/;
var  str='bbs.bblueidea.com';
execReg(reg,str);

結(jié)果如下:

  • index:0
  • input:bbs.bblueidea.com
  • result[0]:b

輸入字符串為bbs.bblueidea.com;

匹配的b在原字符串的索引是0,。

正則的匹配結(jié)果為一個(gè),,b;

var reg =  /(\w)(\w)(.+)/;
var  str='bbs.bblueidea.com';
execReg(reg,str);

結(jié)果為:

index:0
input:bbs.bblueidea.com
result[0]:bbs.bblueidea.com
result[1]:b
result[2]:b
result[3]:s.bblueidea.com

由上面兩個(gè)例子可見,,返回對(duì)象[0]就是整個(gè)正則表達(dá)式所匹配的內(nèi)容,。后續(xù)的元素則是各個(gè)子正則表達(dá)式的匹配內(nèi)容。

exec方法對(duì)正則表達(dá)式的更新

exec方法在返回結(jié)果對(duì)象的同時(shí),,還可能會(huì)更新原來的正則表達(dá)式,,這就要看正則表達(dá)式是否設(shè)置了g修飾符。先來看兩個(gè)例子吧:

var reg = /b/;
var str =  'bbs.blueidea.com';
execReg(reg,str);
execReg(reg,str);

結(jié)果如下:

index:0
input:bbs.blueidea.com
result[0]:b
index:0
input:bbs.blueidea.com
result[0]:b

也就是說,,兩次匹配的結(jié)果完全一樣,,從索引可以看出來,,匹配的都是字符串首的b字符。

下面看看設(shè)置了g的正則表達(dá)式表現(xiàn)如何:

var reg = /b/g;
var str =  'bbs.blueidea.com';
execReg(reg,str);
execReg(reg,str);

結(jié)果如下:

index:0
input:bbs.blueidea.com
result[0]:b
index:1
input:bbs.blueidea.com
result[0]:b

可以看得出來,,第二次匹配的是字符串的字符串的第二個(gè)b,。這也就是g修飾符的作用了,下面來看exec是如何區(qū)別對(duì)待g和非g正則表達(dá)式的,。

如果正則表達(dá)式?jīng)]有設(shè)置g,,那么exec方法不會(huì)對(duì)正則表達(dá)式有任何的影響,如果設(shè)置了g,,那么exec執(zhí)行之后會(huì)更新正則表達(dá)式的lastIndex屬性,,表示本次匹配后,所匹配字符串的下一個(gè)字符的索引,,下一次再用這個(gè)正則表達(dá)式匹配字符串的時(shí)候就會(huì)從上次的lastIndex屬性開始匹配,,也就是上面兩個(gè)例子結(jié)果不同的原因了。

test方法

test方法僅僅檢查是否能夠匹配str,,并且返回布爾值以表示是否成功,。同樣建立一個(gè)簡單的測試函數(shù):

function  testReg(reg,str){
alert(reg.test(str));
}

實(shí)例1

var reg = /b/;
var str =  'bbs.blueidea.com';
testReg(reg,str);

成功,輸出true,。

實(shí)例2

var reg = /9/;
var str =  'bbs.blueidea.com';
testReg(reg,str);

失敗,,返回false。

使用字符串的方法執(zhí)行正則表達(dá)式

match方法

形式:str.match(reg);

與正則表達(dá)式的exec方法類似,,該方法同樣返回一個(gè)類似數(shù)組的對(duì)象,,也有input和index屬性。我們定義如下一個(gè)函數(shù)用來測試:

function  matchReg(reg,str){
var result =  str.match(reg);
if(result ){
document.write('index:'+result.index+'<br  />'
+'input:'+result.input+'<br  />'
);
for(i=0;i<result.length;i++){
document.write('result['+i+']:'+result[i]+'<br  />')
}
}else{
alert('null:匹配失??!')
}
}

例如:

var reg = /b/;
var str =  'bbs.blueidea.com';
matchReg(reg,str);

結(jié)果如下:

index:0
input:bbs.blueidea.com
result[0]:b

可見,和exec的結(jié)果一樣,。

但是如果正則表達(dá)式設(shè)置了g修飾符,,exec和match的行為可就不一樣了,,見下例:

index:undefined
input:undefined
result[0]:b
result[1]:b
result[2]:b

設(shè)置了g修飾符的正則表達(dá)式在完成一次成功匹配后不會(huì)停止,,而是繼續(xù)找到所有可以匹配到的字符。返回的結(jié)果包括了三個(gè)b,。不過沒有提供input和index這些信息,。

replace方法

形式:str. replace (reg,’new str’);

它的作用是將str字符串中匹配reg的部分用’’new str”部分代碼,值得注意的是原字符串并不會(huì)被修改,,而是作為返回值被返回,。例子:

var reg = /b/;
var str =  'bbs.blueidea.com';
var newStr =  str.replace(reg,'c');
document.write(newStr);

結(jié)果為cbs.blueidea.com,只有第一個(gè)b被替換為c,。

var reg = /b/g;
var str =  'bbs.blueidea.com';
var newStr =  str.replace(reg,'c');
document.write(newStr);

輸出ccs.clueidea.com

由于,,設(shè)置了g修飾符,所以會(huì)替換掉所有的b。

var reg = /\w+/g;
var str =  'bbs.blueidea.com';
var newStr =  str.replace(reg,'word');
document.write(newStr);

輸出:

word.word.word,。

在replace函數(shù)中使用$引用子正則表達(dá)式匹配內(nèi)容

就像在正則里我們可以使用\1來引用第一個(gè)子正則表達(dá)式所匹配的內(nèi)容一樣,,我們在replace函數(shù)的替換字符里也可以使用$1來引用相同的內(nèi)容。

還是來看一個(gè)例子吧:

var reg =  /(\w+).(\w+).(\w+)/;
var str =  'bbs.blueidea.com';
var newStr =  str.replace(reg,'$1.$1.$1');
document.write(newStr);

輸出的結(jié)果為:

bbs.bbs.bbs

首先,,我們知道第一個(gè)子正則表達(dá)式匹配到了bbs,,那么$1也就代表bbs了。其后我們把替換字符串設(shè)置為'$1.$1.$1',其實(shí)也就是“bbs.bbs.bbs”,。同理,,$2就是blueidea,$3就是com,。

在來看一個(gè)例子,,顛倒空格前后兩個(gè)單詞的順序。

var reg =  /(\w+)\s(\w+)/;
var str = 'cainiao  gaoshou';
var newStr =  str.replace(reg,'$2 $1');
document.write(newStr);

結(jié)果為:gaoshou cainiao,,也就是空格前后的單詞被調(diào)換順序了,。

由于在替換文本里$有了特殊的含義,所以我們?nèi)绻胍怯?這個(gè)字符的話,,需要寫成$$,,例如:

var reg =  /(\w+)\s(\w+)/;
var str = 'cainiao  gaoshou';
var newStr =  str.replace(reg,'$$ $$');
document.write(newStr);

結(jié)果為:$ $。

search方法和split方法

同樣,,字符串的search方法和split方法中也可以使用正則表達(dá)式,,形式如下:

str.search(reg);

search返回正則表達(dá)式第一次匹配的位置。例子:

var reg = /idea/;
var str = 'blueidea';
var pos =  str.search(reg);
document.write(pos);

結(jié)果為4,。

下面的例子找出第一個(gè)非單詞字符:

var reg = /\W/;
var str =  'bbs.blueidea.com';
var pos =  str.search(reg);
document.write(pos);

結(jié)果為3,,也就是那個(gè)點(diǎn)“.”的位置。

str.split(reg,’seprator’);
split返回分割后的數(shù)組,,例如:
var reg = /\W/;
var str =  'bbs.blueidea.com';
var arr =  str.split(reg);
document.write(arr);

結(jié)果為:bbs,blueidea,com,,可見數(shù)組被非單詞字符分為了有三個(gè)元素的數(shù)組。

var  reg = /\W/;
var  str = 'http://www.baidu.com/';
var  arr = str.split(reg);
document.write(arr.length+'<br  />');
document.write(arr);

結(jié)果為:

7
http,,,www,baidu,com,

可見字符串被分為了有7個(gè)元素的數(shù)組,,其中包括了三個(gè)為空字符串的元素,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多