校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > javascript正則表達式分析第1/2頁

javascript正則表達式分析第1/2頁

熱門標簽:知名的電話機器人 RO地圖標注app 百音電話機器人 高德地圖標注短信簽約 湖南企業智能外呼系統供應商 福州工作銷售電話機器人 自制電銷機器人 錫林郭勒盟地圖標注位置 電銷機器人公司簡介
什么是正則表達式?
這個問題可以參見:“正則表達式30分鐘入門教程”,很多編程語言都支持正則表達式,本文僅僅討論JavaScript中的正則表達式。
創建一個正則表達式
第一種方法:
復制代碼 代碼如下:

var reg = /pattern/;

第二種方法:
復制代碼 代碼如下:

var reg = new RegExp('pattern');

正則表達式的exec方法簡介
語法:
reg.exec(str);
其中str為要執行正則表達式的目標字符串。
例如:
復制代碼 代碼如下:

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

將會輸出test,因為正則表達式reg會匹配str(‘testString')中的'test'子字符串,并且將其返回。

我們使用下面的函數來做匹配正則的練習:
復制代碼 代碼如下:

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

函數接受一個正則表達式參數reg和一個目標字符串參數str,執行之后會alert出正則表達式與字符串的匹配結果。
用這個函數測試上面的例子就是:
復制代碼 代碼如下:

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,實在是很無聊,同樣的任務用indexOf方法就可以完成了。用正則,自然是要完成更強大的功能:
一片兩片三四片,落盡正則全不見
上面的小標題翻譯成正則就是{1},{2},{3,4},{1,}。
c{n}
{1}表示一個的意思。
/c{1}/只能匹配一個c。
/c{2}/則會匹配兩個連續的c。
以此類推,
/c{n}/則會匹配n個連續的c。
看下面的例子:
復制代碼 代碼如下:

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

返回結果c
復制代碼 代碼如下:

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

返回結果null,表示沒有匹配成功。
復制代碼 代碼如下:

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

返回結果cc。
c{m,n}
c{3,4}的意思是,連續的3個c或者4個c。
例如
復制代碼 代碼如下:

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

返回結果null,表示沒有匹配成功。
復制代碼 代碼如下:

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

結果返回ccc。
復制代碼 代碼如下:

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

結果返回cccc,這表明正則會盡量多品牌,可3可4的時候它會選擇多匹配一個。
復制代碼 代碼如下:

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

仍然只匹配4個c。

由以上例子可以推斷出,c{m,n}表示m個到n個c,且m小于等于n。
c{n,}
c{1,}表示1個以上的c。例如:
復制代碼 代碼如下:

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

結果返回c。
復制代碼 代碼如下:

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

返回ccccc,再次說明了正則表達式會盡量多地匹配。
復制代碼 代碼如下:

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

結果返回null,c{2,}表示2個以上的c,而cainiao中只有1個c。

由以上例子可知,c{n,}表示最少n個c,最多則不限個數。

*,+,?
*表示0次或者多次,等同于{0,},即
c* 和 c{0,} 是一個意思。

+表示一次或者多次,等同于{1,},即
c+ 和 c{1,} 是一個意思。

最后,?表示0次或者1次,等同于{0,1},即
c? 和 c{0,1} 是一個意思。

貪心與非貪心
人都是貪婪的,正則也是如此。我們在例子reg = /c{3,4}/;str='ccccTest';的例子中已經看到了,能匹配四個的時候,正則絕對不會去匹配三個。上面所介紹的所有的正則都是這樣,只要在合法的情況下,它們會盡量多去匹配字符,這就叫做貪心模式。
如果我們希望正則盡量少地匹配字符,那么就可以在表示數字的符號后面加上一個?。組成如下的形式:
{n,}?, *?, +?, ??, {m,n}?
同樣來看一個例子:
復制代碼 代碼如下:

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

返回的結果只有1個c,盡管有5個c可以匹配,但是由于正則表達式是非貪心模式,所以只會匹配一個。
/^開頭,結尾$/
^表示只匹配字符串的開頭。看下面的例子:
復制代碼 代碼如下:

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

結果為null,因為字符串‘維生素c'的開頭并不是c,所以匹配失敗。
復制代碼 代碼如下:

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

這次則返回c,匹配成功,因為cainiao恰恰是以c開頭的。

與^相反,$則只匹配字符串結尾的字符,同樣,看例子:
復制代碼 代碼如下:

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

返回null,表示正則表達式沒能在字符串的結尾找到c這個字符。
復制代碼 代碼如下:

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

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

點'.'
‘.'會匹配字符串中除了換行符\n之外的所有字符,例如
復制代碼 代碼如下:

reg = /./;
str='cainiao';
execReg(reg,str);

結果顯示,正則匹配到了字符c。
復制代碼 代碼如下:

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

這次是b。
復制代碼 代碼如下:

reg = /.+/;
str='blueidea——經典論壇 好_。';
execReg(reg,str);

結果是“blueidea——經典論壇 好_。“也就是說所有的字符都被匹配掉了,包括一個空格,一個下滑線,和一個破折號。
復制代碼 代碼如下:

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

同樣,直接返回整個字符串——bbs.blueidea.com,可見”.”也匹配”.”本身。
復制代碼 代碼如下:

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

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

二選一,正則表達式中的或,“|“
b|c表示,匹配b或者c。
例如:
復制代碼 代碼如下:

reg = /b|c/;
str='blueidea';
execReg(reg,str);

結果是b。
復制代碼 代碼如下:

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

結果是c。
復制代碼 代碼如下:

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

匹配掉整個cainiao。
復制代碼 代碼如下:

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

結果只有一個b,而不是整個字符串。因為上面正則表達式的意思是,匹配開頭的b或者是c.+。
括號
復制代碼 代碼如下:

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

這次的結果是整個串bbs.blueidea.com,機上上面的括號這后,這個正則的意思是,如果字符串的開頭是b或者c,那么匹配開頭的b或者c以及其后的所有的非換行字符。
如果你也實驗了的話,會發現返回的結果后面多出來一個“,b“,這是()內的b|c所匹配的內容。我們在正則表達式內括號里寫的內容會被認為是子正則表達式,所匹配的結果也會被記錄下來供后面使用。我們暫且不去理會這個特性。

字符集合[abc]
[abc]表示a或者b或者c中的任意一個字符。例如:
復制代碼 代碼如下:

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

返回結果是b。
復制代碼 代碼如下:

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

這次的結果就是null了。

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

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

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

反字符集合[^abc]
^在正則表達式開始部分的時候表示開頭的意思,例如/^c/表示開頭是c;但是在字符集和中,它表示的是類似“非“的意思,例如[^abc]就表示不能是a,b或者c中的任何一個。例如:
復制代碼 代碼如下:

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

返回的結果是l,因為它是第一個非abc的字符(即第一個b沒有匹配)。同樣:
復制代碼 代碼如下:

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

則返回i,前兩個字符都是[abc]集合中的。
由此我們可知:[^0-9]表示非數字,[^a-z]表示非小寫字母,一次類推。

邊界與非邊界
\b表示的邊界的意思,也就是說,只有字符串的開頭和結尾才算數。例如/\bc/就表示字符串開始的c或者是結尾的c。看下面的例子:
復制代碼 代碼如下:

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

返回結果c。匹配到了左邊界的c字符。
復制代碼 代碼如下:

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

仍然返回c,不過這次返回的是右側邊界的c。
復制代碼 代碼如下:

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

這次匹配失敗,因為bcb字符串中的c被夾在中間,既不在左邊界也不再右邊界。

與\b對應\B表示非邊界。例如:
復制代碼 代碼如下:

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

這次會成功地匹配到bcb中的c,。然而
復制代碼 代碼如下:

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

則會返回null。因為\B告訴正則,只匹配非邊界的c。

數字與非數字
\d表示數字的意思,相反,\D表示非數字。例如:
復制代碼 代碼如下:

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

返回的匹配結果為8,因為它是第一個數字字符。
復制代碼 代碼如下:

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

返回c,第一個非數字字符。

空白
\f匹配換頁符,\n匹配換行符,\r匹配回車,\t匹配制表符,\v匹配垂直制表符。
\s匹配單個空格,等同于[\f\n\r\t\v]。例如:
復制代碼 代碼如下:

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

匹配結果為This,當遇到第一個空格之后,正則就停止匹配了。

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

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

返回完整的blueidea字符串,因為所有字符都是單詞字符。
復制代碼 代碼如下:

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

結果顯示匹配了字符串中的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,l
bl是整個正則匹配的內容,b是第一個括號里的子正則表達式匹配的內容,l是第二個括號匹配的內容。
3.
復制代碼 代碼如下:

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

則會返回null。這里的“\1”就叫做反向引用,它表示的是第一個括號內的字正則表達式匹配的內容。在上面的例子中,第一個括號里的(\w)匹配了b,因此“\1”就同樣表示b了,在余下的字符串里自然找不到b了。
與第二個例子對比就可以發現,“\1”是等同于“第1個括號匹配的內容”,而不是“第一個括號的內容”。
復制代碼 代碼如下:

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

這個正則則會匹配到bb。

同樣,前面有幾個子正則表達式我們就可以使用幾個反向引用。例如:
復制代碼 代碼如下:

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

會匹配成功,因為第一個括號匹配到w,第二個括號匹配到o,而\2\1則表示ow,恰好匹配了字符串的最后兩個字符。

括號(2)
前面我們曾經討論過一次括號的問題,見下面這個例子:
復制代碼 代碼如下:

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

這個正則是為了實現只匹配以b或者c開頭的字符串,一直匹配到換行字符,但是。上面我們已經看到了,可以使用“\1”來反向引用這個括號里的子正則表達式所匹配的內容。而且exec方法也會將這個字正則表達式的匹配結果保存到返回的結果中。
不記錄子正則表達式的匹配結果
使用形如(?:pattern)的正則就可以避免保存括號內的匹配結果。例如:
復制代碼 代碼如下:

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

可以看到返回的結果不再包括那個括號內的字正則表達式多匹配的內容。
同理,反向引用也不好使了:
復制代碼 代碼如下:

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

返回bb,b。bb是整個正則表達式匹配的內容,而b是第一個子正則表達式匹配的內容。
復制代碼 代碼如下:

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

返回null。由于根本就沒有記錄括號內匹配的內容,自然沒有辦法反向引用了。

正向預查
形式:(?=pattern)
所謂正向預查,意思就是:要匹配的字符串,后面必須緊跟著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。
需要注意的是,括號里的內容并不參與真正的匹配,只是檢查一下后面的字符是否符合要求而已,例如上面的正則,返回的是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);
/[code]
則成功返回blue。

匹配元字符
首先要搞清楚什么是元字符呢?我們之前用過*,+,?之類的符號,它們在正則表達式中都有一定的特殊含義,類似這些有特殊功能的字符都叫做元字符。例如
reg = /c*/;
表示有任意個c,但是如果我們真的想匹配'c*'這個字符串的時候怎么辦呢?只要將*轉義了就可以了,如下:
[code]
reg = /c\*/;
str='c*';
execReg(reg,str);

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

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

正則表達式的修飾符
全局匹配,修飾符g
形式:/pattern/g
例子:reg = /b/g;
后面再說這個g的作用。先看后面的兩個修飾符。
不區分大小寫,修飾符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/m
m修飾符的作用是修改^和$在正則表達式中的作用,讓它們分別表示行首和行尾。例如:
復制代碼 代碼如下:

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

匹配失敗,因為字符串的開頭沒有b字符。但是加上m修飾符之后:
復制代碼 代碼如下:

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

匹配到b,因為加了m修飾符之后,^已經表示行首,由于bbs在字符串第二行的行首,所以可以成功地匹配。
exec方法詳解
exec方法的返回值
exec方法返回的其實并不是匹配結果字符串,而是一個對象,簡單地修改一下execReg函數,來做一個實驗就可以印證這一點:
復制代碼 代碼如下:

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

結果顯示result的類型是object。而且是一個類似數組的對象。使用for in可以知道它的屬性: index input 0。其中index是表示匹配在原字符串中的索引;而input則是表示輸入的字符串;
至于0則是表示只有一個匹配結果,可以用下標0來引用這個匹配結果,這個數量可能改變。我們可以通過返回值的length屬性來得知匹配結果的總數量。
根據以上對返回值的分析,修改execReg函數如下:
復制代碼 代碼如下:

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

馬上來實驗一下:
復制代碼 代碼如下:

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

結果如下:
index:0
input:bbs.bblueidea.com
result[0]:b
輸入字符串為bbs.bblueidea.com;
匹配的b在原字符串的索引是0。
正則的匹配結果為一個,b;
復制代碼 代碼如下:

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

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

由上面兩個例子可見,返回對象[0]就是整個正則表達式所匹配的內容。后續的元素則是各個子正則表達式的匹配內容。

exec方法對正則表達式的更新
exec方法在返回結果對象的同時,還可能會更新原來的正則表達式,這就要看正則表達式是否設置了g修飾符。先來看兩個例子吧:
復制代碼 代碼如下:

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

結果如下:
index:0
input:bbs.blueidea.com
result[0]:b
index:0
input:bbs.blueidea.com
result[0]:b
也就是說,兩次匹配的結果完全一樣,從索引可以看出來,匹配的都是字符串首的b字符。
下面看看設置了g的正則表達式表現如何:
復制代碼 代碼如下:

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

結果如下:
index:0
input:bbs.blueidea.com
result[0]:b
index:1
input:bbs.blueidea.com
result[0]:b
可以看得出來,第二次匹配的是字符串的字符串的第二個b。這也就是g修飾符的作用了,下面來看exec是如何區別對待g和非g正則表達式的。

如果正則表達式沒有設置g,那么exec方法不會對正則表達式有任何的影響,如果設置了g,那么exec執行之后會更新正則表達式的lastIndex屬性,表示本次匹配后,所匹配字符串的下一個字符的索引,下一次再用這個正則表達式匹配字符串的時候就會從上次的lastIndex屬性開始匹配,也就是上面兩個例子結果不同的原因了。

test方法
test方法僅僅檢查是否能夠匹配str,并且返回布爾值以表示是否成功。同樣建立一個簡單的測試函數:
復制代碼 代碼如下:

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

實例1
復制代碼 代碼如下:

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

成功,輸出true。
實例2
復制代碼 代碼如下:

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

失敗,返回false。
使用字符串的方法執行正則表達式
match方法
形式:str.match(reg);
與正則表達式的exec方法類似,該方法同樣返回一個類似數組的對象,也有input和index屬性。我們定義如下一個函數用來測試:
復制代碼 代碼如下:

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

例如:
復制代碼 代碼如下:

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

結果如下:
index:0
input:bbs.blueidea.com
result[0]:b
可見,和exec的結果一樣。
但是如果正則表達式設置了g修飾符,exec和match的行為可就不一樣了,見下例:
index:undefined
input:undefined
result[0]:b
result[1]:b
result[2]:b
設置了g修飾符的正則表達式在完成一次成功匹配后不會停止,而是繼續找到所有可以匹配到的字符。返回的結果包括了三個b。不過沒有提供input和index這些信息。

replace方法
形式:str. replace (reg,'new str');
它的作用是將str字符串中匹配reg的部分用''new str”部分代碼,值得注意的是原字符串并不會被修改,而是作為返回值被返回。例子:
復制代碼 代碼如下:

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

結果為cbs.blueidea.com,只有第一個b被替換為c。
復制代碼 代碼如下:

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

輸出ccs.clueidea.com
由于,設置了g修飾符,所以會替換掉所有的b。
復制代碼 代碼如下:

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

輸出:
word.word.word。
在replace函數中使用$引用子正則表達式匹配內容
就像在正則里我們可以使用\1來引用第一個子正則表達式所匹配的內容一樣,我們在replace函數的替換字符里也可以使用$1來引用相同的內容。
還是來看一個例子吧:
復制代碼 代碼如下:

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

輸出的結果為:
bbs.bbs.bbs
首先,我們知道第一個子正則表達式匹配到了bbs,那么$1也就代表bbs了。其后我們把替換字符串設置為'$1.$1.$1',其實也就是“bbs.bbs.bbs”。同理,$2就是blueidea,$3就是com。

在來看一個例子,顛倒空格前后兩個單詞的順序。
復制代碼 代碼如下:

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

結果為:gaoshou cainiao,也就是空格前后的單詞被調換順序了。

由于在替換文本里$有了特殊的含義,所以我們如果想要是用$這個字符的話,需要寫成$$,例如:
復制代碼 代碼如下:

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

結果為:$ $。

search方法和split方法
同樣,字符串的search方法和split方法中也可以使用正則表達式,形式如下:
str.search(reg);
search返回正則表達式第一次匹配的位置。例子:
復制代碼 代碼如下:

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

結果為4。
下面的例子找出第一個非單詞字符:
復制代碼 代碼如下:

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

結果為3,也就是那個點“.”的位置。
復制代碼 代碼如下:

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

結果為:bbs,blueidea,com,可見數組被非單詞字符分為了有三個元素的數組。
復制代碼 代碼如下:

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

結果為:
7
http,,,www,baidu,com,
可見字符串被分為了有7個元素的數組,其中包括了三個為空字符串的元素。


12下一頁閱讀全文

標簽:茂名 西寧 河北 怒江 秦皇島 昆明 吉林 玉林

巨人網絡通訊聲明:本文標題《javascript正則表達式分析第1/2頁》,本文關鍵詞  javascript,正則,表達式,分析,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《javascript正則表達式分析第1/2頁》相關的同類信息!
  • 本頁收集關于javascript正則表達式分析第1/2頁的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品理伦片| 国产欧美精品区一区二区三区| 国产不卡高清在线观看视频| 日韩专区在线视频| 综合久久久久久| wwww国产精品欧美| 欧美三级在线视频| 91福利视频久久久久| 粉嫩高潮美女一区二区三区 | 亚洲天堂免费在线观看视频| 久久婷婷国产综合精品青草| 欧美日产在线观看| 欧美日韩精品免费观看视频| 91麻豆蜜桃一区二区三区| 国产伦精品一区二区三区免费迷| 精品亚洲国内自在自线福利| 丝袜美腿亚洲色图| 视频一区视频二区中文| 亚洲狠狠丁香婷婷综合久久久| 国产精品美女www爽爽爽| 日本一区二区三级电影在线观看| 国产日韩高清在线| 国产精品的网站| 亚洲激情av在线| 午夜精品福利久久久| 日本v片在线高清不卡在线观看| 图片区小说区区亚洲影院| 日韩在线卡一卡二| 紧缚奴在线一区二区三区| 国产美女视频91| 91色乱码一区二区三区| 91精品在线麻豆| 国产精品国产三级国产aⅴ中文| 国产精品视频一二三| 亚洲国产精品一区二区尤物区| 美女视频黄 久久| 99久久夜色精品国产网站| 欧美精品免费视频| 国产精品情趣视频| 蜜桃久久久久久久| 色先锋资源久久综合| 久久这里只有精品6| 亚洲国产成人porn| 国产成人精品亚洲日本在线桃色| 91九色最新地址| 国产性天天综合网| 美女www一区二区| 日本韩国欧美一区二区三区| 久久久久九九视频| 久久99久久精品| 在线观看欧美精品| 国产精品的网站| 国产精一品亚洲二区在线视频| 欧美日韩国产大片| 亚洲视频 欧洲视频| 国产精品影视在线观看| 久久网站热最新地址| 日韩国产精品久久| 欧美日本一区二区| 亚洲一线二线三线久久久| 成人教育av在线| 欧美精品一区二区久久久| 日韩av中文字幕一区二区| 欧美日韩专区在线| 亚洲一级二级三级在线免费观看| 色婷婷久久一区二区三区麻豆| 亚洲欧美在线视频观看| 波多野洁衣一区| 中文字幕不卡三区| 91蜜桃视频在线| 亚洲黄色在线视频| 3d成人动漫网站| 国产最新精品精品你懂的| 国产欧美一区二区精品秋霞影院| 高清成人免费视频| 亚洲专区一二三| 日韩一区和二区| 国产不卡视频在线播放| 亚洲精品少妇30p| 欧美中文字幕不卡| 久久99精品久久只有精品| 中文字幕中文字幕中文字幕亚洲无线| 国产成人精品亚洲777人妖 | 中文字幕一区二区在线观看| 成人一二三区视频| 亚洲一区二区高清| 久久五月婷婷丁香社区| 色婷婷综合久色| 国内成人精品2018免费看| 国产精品久久久久9999吃药| 欧美丰满高潮xxxx喷水动漫| 国产成人午夜精品5599| 亚洲一区在线观看免费 | 亚洲欧美一区二区三区久本道91 | 成人黄页在线观看| 中文天堂在线一区| 久久综合视频网| 亚洲精品在线免费观看视频| 7777精品伊人久久久大香线蕉| 激情综合网最新| 亚洲精品日韩专区silk| 欧美成人综合网站| 91国产福利在线| 成人深夜福利app| 蜜臀国产一区二区三区在线播放| 国产精品每日更新在线播放网址| 制服丝袜亚洲精品中文字幕| av一区二区不卡| 韩国一区二区三区| 日本vs亚洲vs韩国一区三区二区 | 欧美一区二区精品在线| 欧美综合亚洲图片综合区| av激情综合网| 972aa.com艺术欧美| 成人性视频免费网站| 国产成人在线影院| 国产麻豆欧美日韩一区| 极品美女销魂一区二区三区| 国产精品自拍在线| 国产伦精品一区二区三区免费| 韩国三级中文字幕hd久久精品| 韩国三级中文字幕hd久久精品| 久久av资源站| 不卡一区二区中文字幕| 成人深夜福利app| 国产精品日产欧美久久久久| 亚洲另类在线一区| 久久99这里只有精品| 在线观看国产一区二区| 久久久久久久久久久久电影| 国产精品久久久久桃色tv| 一区二区三区在线视频观看 | 麻豆专区一区二区三区四区五区| 国产一区二区看久久| 成人午夜在线视频| 欧美视频中文一区二区三区在线观看| 欧美日韩美少妇| 久久久99精品免费观看不卡| 综合自拍亚洲综合图不卡区| 性做久久久久久久免费看| 成人精品视频一区二区三区| 欧美疯狂做受xxxx富婆| 国产精品灌醉下药二区| 亚洲欧美日韩国产另类专区 | 成人欧美一区二区三区在线播放| 麻豆91在线观看| 91国偷自产一区二区使用方法| 欧美xxxxxxxx| 亚洲高清一区二区三区| 成人小视频免费在线观看| 欧美高清激情brazzers| 国产精品午夜电影| 韩国女主播一区| 欧美区在线观看| 有码一区二区三区| 99久久精品99国产精品| 精品国产乱码91久久久久久网站| 国产精品福利在线播放| 国产成人综合视频| 精品国一区二区三区| 精品一区二区三区影院在线午夜 | 欧美日韩精品免费观看视频| 天天操天天色综合| 日韩亚洲欧美高清| 国产乱对白刺激视频不卡| 久久久精品日韩欧美| 色爱区综合激月婷婷| 欧美国产一区二区在线观看| 国内精品伊人久久久久av影院 | 日本午夜精品视频在线观看| 欧美群妇大交群中文字幕| 亚洲国产精品精华液网站| 欧美性欧美巨大黑白大战| 亚洲国产精品精华液网站| 欧美二区三区91| 精品一二三四区| 国产精品污www在线观看| 成人性色生活片| 中文字幕av一区 二区| 成人综合在线观看| 亚洲观看高清完整版在线观看| 色88888久久久久久影院按摩| 亚洲同性gay激情无套| 91视频在线看| 亚洲妇熟xx妇色黄| 欧美一级久久久| 国产裸体歌舞团一区二区| 久久精品日韩一区二区三区| 成人一区二区三区| 亚洲色图制服诱惑 | 91福利视频在线| 亚洲成a人片综合在线| jizz一区二区| 天堂av在线一区| 日韩一区二区三区视频在线观看| 久久精品噜噜噜成人88aⅴ| 精品久久99ma| 99精品视频在线免费观看| 亚洲一区精品在线| 精品国产不卡一区二区三区|