exec、match料睛、test等使用正則表達式的函數區(qū)別

Paste_Image.png

一丐箩、exec 方法

用正則表達式模式在字符串中查找摇邦,并返回該查找結果的第一個值(數組),如果匹配失敗屎勘,返回null施籍。
rgExp.exec(str)
**參數 **
rgExp
必選項。包含正則表達式模式和可用標志的正則表達式對象概漱。
str
必選項丑慎。要在其中執(zhí)行查找的 String 對象或字符串文字。
**返回數組包含: **
input:整個被查找的字符串的值犀概;
index:匹配結果所在的位置(位)立哑;
arr:結果值,arr[0]全匹配結果姻灶,arr[1,2...]為表達式內()的子匹配铛绰,由左至右為1,2...。
注意:在匹配后产喉,rgExp 的 lastIndex 屬性被設置為匹配文本的最后一個字符的下一個位置捂掰。lastIndex并不在返回對象的屬性中,而是正則表達式對象的屬性曾沈。
例子1:不含子表達式的正則表達式exec方法循環(huán)應用

!function RegExpTest(){ 
    var src="http://sumsung753.blog.163.com/blog/I love you!"; 
    // 注意g將全文匹配这嚣,不加將永遠只返回第一個匹配。 
    var re = /\w+/g; 
    var arr; 
    // exec使arr返回匹配的第一個塞俱,while循環(huán)一次將使re在g作用尋找下一個匹配姐帚。 
    while((arr = re.exec(src)) !=null){ 
        document.write(arr.index + "-" + re.lastIndex + ":" + arr + "<br/>"); 
        for(key in arr){ 
            document.write(key + "=>" + arr[key] + "<br/>"); 
        } 
        document.write("<br/>"); 
    } 
}() 

輸出結果:

0-4:http
0=>http
index=>0
input=>http://sumsung753.blog.163.com/blog/I love you!

7-17:sumsung753
0=>sumsung753
index=>7
input=>http://sumsung753.blog.163.com/blog/I love you!

18-22:blog
0=>blog
index=>18
input=>http://sumsung753.blog.163.com/blog/I love you!

23-26:163
0=>163
index=>23
input=>http://sumsung753.blog.163.com/blog/I love you!

27-30:com
0=>com
index=>27
input=>http://sumsung753.blog.163.com/blog/I love you!

31-35:blog
0=>blog
index=>31
input=>http://sumsung753.blog.163.com/blog/I love you!

36-37:I
0=>I
index=>36
input=>http://sumsung753.blog.163.com/blog/I love you!

38-42:love
0=>love
index=>38
input=>http://sumsung753.blog.163.com/blog/I love you!

43-46:you
0=>you
index=>43
input=>http://sumsung753.blog.163.com/blog/I love you!

exec默認只返回匹配結果的第一個值,比如上例如果不用while循環(huán)障涯,將只返回'http'(盡管后面的sumsung753等都符合表達式)罐旗,無論re表達式用不用全局標記g。但是如果為正則表達式設置了全局標記g唯蝶,exec從上次匹配結束的位置開始查找九秀。如果沒有設置全局標志,exec依然從字符串的起始位置開始搜索粘我。利用這個特點可以反復調用exec遍歷所有匹配鼓蜒,等價于match具有g標志。當然征字,如果正則表達式忘記用g都弹,而又用循環(huán)(比如:while、for等)匙姜,exec將每次都循環(huán)第一個缔杉,造成死循環(huán)。

如果正則表達式中包含子表達式搁料,那么輸出結果將包含子匹配項
例子2:包含子表達式的正則表達式exec方法應用

!function execDemo(){ 
    var r, re; // 聲明變量或详。 
    var s = "The rain in Spain falls mainly in the plain"; 
    re = /[\w]*(ai)n/ig; 
    r = re.exec(s); 
    document.write(r + "<br/>");
    for(key in r){ 
        document.write(key + "-" + r[key] + "<br/>"); 
    } 
}() 

輸出結果如下:
rain,ai
0-rain
1-ai
index-4
input-The rain in Spain falls mainly in the plain

例子3:包含子表達式的正則表達式exec方法循環(huán)應用

!function execDemo(){ 
    var r, re; // 聲明變量系羞。 
    var s = "The rain in Spain falls mainly in the plain"; 
    re = /[\w]*(ai)n/ig; 
    while((r = re.exec(s))!=null){
        document.write(r + "<br/>"); 
        for(key in r){ 
            document.write(key + "-" + r[key] + "<br/>"); 
        } 
    }
}() 

輸出結果:

rain,ai
0-rain
1-ai
index-4
input-The rain in Spain falls mainly in the plain
Spain,ai
0-Spain
1-ai
index-12
input-The rain in Spain falls mainly in the plain
main,ai
0-main
1-ai
index-24
input-The rain in Spain falls mainly in the plain
plain,ai
0-plain
1-ai
index-38
input-The rain in Spain falls mainly in the plain

二、match 方法

使用正則表達式模式對字符串執(zhí)行查找霸琴,并將包含查找的結果作為數組返回椒振。
stringObj.match(rgExp)
**參數 **
stringObj
必選項。對其進行查找的 String 對象或字符串文字梧乘。
rgExp
必選項澎迎。為包含正則表達式模式和可用標志的正則表達式對象。也可以是包含正則表達式模式和可用標志的變量名或字符串文字选调。
其余說明與exec一樣夹供,不同的是如果match的表達式匹配了全局標記g將出現所有匹配項,而不用循環(huán)仁堪,但所有匹配中不會包含子匹配項哮洽。
**例子4: **

!function MatchDemo(){
    // 聲明變量。
    var r, re; 
    var s = "The rain in Spain falls mainly in the plain";
    // 創(chuàng)建正則表達式模式弦聂。
    re = /(a)in/ig; 
    // 嘗試去匹配搜索字符串鸟辅。
    r = s.match(re); 
    // 返回的數組包含了所有 "ain" 出現的四個匹配,r[0]莺葫、r[1]匪凉、r[2]、r[3]捺檬。
    //但沒有子匹配項a再层。
    document.write(r); 
}()

輸出結果:ain,ain,ain,ain

說明:
match() 方法將檢索字符串 stringObject,以找到一個或多個與 regexp 匹配的文本堡纬。這個方法的行為在很大程度上有賴于 regexp 是否具有標志 g聂受。
如果 regexp 沒有標志 g,那么 match() 方法就只能在 stringObject 中執(zhí)行一次匹配隐轩。如果沒有找到任何匹配的文本, match() 將返回 null渤早。否則职车,它將返回一個數組,其中存放了與它找到的匹配文本有關的信息鹊杖。該數組的第 0 個元素存放的是匹配文本悴灵,而其余的元素存放的是與正則表達式的子表達式匹配的文本。除了這些常規(guī)的數組元素之外骂蓖,返回的數組還含有兩個對象屬性积瞒。index 屬性聲明的是匹配文本的起始字符在 stringObject 中的位置,input 屬性聲明的是對 stringObject 的引用登下。
如果 regexp 具有標志 g茫孔,則 match() 方法將執(zhí)行全局檢索叮喳,找到 stringObject 中的所有匹配子字符串。若沒有找到任何匹配的子串缰贝,則返回 null馍悟。如果找到了一個或多個匹配子串,則返回一個數組剩晴。不過全局匹配返回的數組的內容與前者大不相同锣咒,它的數組元素中存放的是 stringObject 中所有的匹配子串,而且也沒有 index 屬性或 input 屬性赞弥。
注意:在全局檢索模式下毅整,match() 即不提供與子表達式匹配的文本的信息,也不聲明每個匹配子串的位置绽左。如果您需要這些全局檢索的信息悼嫉,可以使用 RegExp.exec()。

三妇菱、test方法

用于檢測一個字符串是否匹配某個模式
rgExp.test(str)
返回值
如果字符串 string 中含有與 RegExpObject 匹配的文本承粤,則返回 true,否則返回 false闯团。
說明
調用 RegExp 對象 r 的 test() 方法辛臊,并為它傳遞字符串 s,與這個表示式是等價的:(r.exec(s) != null)房交。
例子5:

var str = "hello world!";
var result = /^hello/.test(str);
console.log(result); // true

**test()繼承正則表達式的lastIndex屬性彻舰,表達式在匹配全局標志g的時候須注意。 **
例子6:

function testDemo(){ 
    var r, re; // 聲明變量候味。 
    var s = "I"; 
    re = /I/ig; // 創(chuàng)建正則表達式模式刃唤。 
    document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果。 
    document.write(re.test(s) + "<br/>"); 
    document.write(re.test(s)); 
} 
testDemo(); 

輸出結果:
true
false
true
當第二次調用test()的時候白群,lastIndex指向下一次匹配所在位置1尚胞,所以第二次匹配不成功,lastIndex重新指向0帜慢,等于第三次又重新匹配笼裳。
例子7:

function testDemo(){ 
    var r, re; // 聲明變量。 
    var s = "I"; 
    re = /I/ig; // 創(chuàng)建正則表達式模式粱玲。 
    document.write(re.test(s) + "<br/>"); // 返回 Boolean 結果躬柬。 
    document.write(re.lastIndex); 
} 
testDemo(); 

輸出:
true
1
當再次調用document.write(re.test(s) + "
")時輸出false,原因就是從第2個字符開始搜索的抽减。解決方法:將test()的lastIndex屬性每次重新指向0允青,re.lastIndex = 0;

四、search方法

用于檢索字符串中指定的子字符串卵沉,或檢索與正則表達式相匹配的子字符串颠锉。
stringObject.search(regexp)
參數
regexp
該參數可以是需要在 stringObject 中檢索的子串法牲,也可以是需要檢索的 RegExp 對象。如果要執(zhí)行忽略大小寫的檢索木柬,請在正則表達式中添加標志 i皆串。
返回值
stringObject 中第一個與 regexp 相匹配的子串的起始位置。如果沒有找到任何匹配的子串眉枕,則返回 -1恶复。
說明
search() 方法不執(zhí)行全局匹配,它將忽略標志 g速挑。它同時忽略 regexp 的 lastIndex 屬性谤牡,并且總是從字符串的開始進行檢索,這意味著它總是返回 stringObject 的第一個匹配的位置姥宝。
例子8:

var str="Visit W3School!"
document.write(str.search(/w3school/i))

五翅萤、replace方法

用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串腊满。
stringObject.replace(regexp/substr, replacement)
參數
regexp/substr
必需套么。規(guī)定子字符串或要替換的模式的 RegExp 對象。
replacement
必需碳蛋。替換文本或生成替換文本的函數胚泌。
返回值
replace 方法的結果是一個完成了指定替換的 stringObj 對象的復制。這個新的字符串對象肃弟,是用 replacement 替換了 regexp 的第一次匹配或所有匹配之后得到的玷室。
說明
replace() 方法將在 stringObject 中查找與 regexp 相匹配的子字符串,然后用 replacement 來替換這些子串笤受。如果 regexp 具有全局標志 g穷缤,那么 replace() 方法將替換所有匹配的子串。否則箩兽,它只替換第一個匹配子串津肛。
replacement 可以是字符串,也可以是函數汗贫。如果它是字符串身坐,那么每個匹配都將由字符串替換。但是 replacement 中的 $ 字符具有特定的含義芳绩。如下表所示掀亥,它說明從模式匹配得到的字符串將用于替換撞反。

Paste_Image.png

注意:ECMAScript v3 規(guī)定妥色,replace() 方法的參數 replacement 可以是函數而不是字符串。在這種情況下遏片,每個匹配都調用該函數嘹害,它返回的字符串將作為替換文本使用撮竿。該函數的第一個參數是匹配模式的字符串。接下來的參數是與模式中的子表達式匹配的字符串笔呀,可以有 0 個或多個這樣的參數幢踏。接下來的參數是一個整數,聲明了匹配在 stringObject 中出現的位置许师。最后一個參數是 stringObject 本身房蝉。
例子9:將所有單詞首字母大寫

name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
  return word.substring(0,1).toUpperCase()+word.substring(1);}
);

例子10:將Doe, John替換為John, Doe

name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");

六、split() 方法

用于把一個字符串分割成字符串數組微渠。
stringObject.split(separator,howmany)
參數
separator
必需搭幻。字符串或正則表達式,從該參數指定的地方分割 stringObject逞盆。
howmany
可選檀蹋。該參數可指定返回的數組的最大長度。如果設置了該參數云芦,返回的子串不會多于這個參數指定的數組俯逾。如果沒有設置該參數,整個字符串都會被分割舅逸,不考慮它的長度桌肴。
返回值
一個字符串數組。該數組是通過在 separator 指定的邊界處將字符串 stringObject 分割成子串創(chuàng)建的堡赔。返回的數組中的字串不包括separator 自身识脆。
但是,如果 separator 是包含子表達式的正則表達式善已,那么返回的數組中包括與這些子表達式匹配的字串(但不包括與整個正則表達式匹配的文本)灼捂。
注意
如果把空字符串 ("") 用作 separator,那么 stringObject 中的每個字符之間都會被分割换团。
String.split() 執(zhí)行的操作與 Array.join 執(zhí)行的操作是相反的悉稠。
例子11:

var str="How are you doing today?"

document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

輸出
How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市艘包,隨后出現的幾起案子的猛,更是在濱河造成了極大的恐慌,老刑警劉巖想虎,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卦尊,死亡現場離奇詭異,居然都是意外死亡舌厨,警方通過查閱死者的電腦和手機岂却,發(fā)現死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躏哩,你說我怎么就攤上這事署浩。” “怎么了扫尺?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵筋栋,是天一觀的道長。 經常有香客問我正驻,道長弊攘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任姑曙,我火速辦了婚禮肴颊,結果婚禮上,老公的妹妹穿的比我還像新娘渣磷。我一直安慰自己婿着,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布醋界。 她就那樣靜靜地躺著竟宋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪形纺。 梳的紋絲不亂的頭發(fā)上丘侠,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音逐样,去河邊找鬼蜗字。 笑死,一個胖子當著我的面吹牛脂新,可吹牛的內容都是我干的挪捕。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼争便,長吁一口氣:“原來是場噩夢啊……” “哼级零!你這毒婦竟也來了?” 一聲冷哼從身側響起滞乙,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤奏纪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斩启,有當地人在樹林里發(fā)現了一具尸體序调,經...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年兔簇,在試婚紗的時候發(fā)現自己被綠了发绢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荣挨。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朴摊,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情此虑,我是刑警寧澤甚纲,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站朦前,受9級特大地震影響介杆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜韭寸,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一春哨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恩伺,春花似錦赴背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褒脯,卻和暖如春便瑟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背番川。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工到涂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颁督。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓践啄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沉御。 傳聞我的和親對象是個殘疾皇子往核,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內容