javascript 中String.match()與RegExp.exec()的區(qū)別說明
更新時間:2013年01月10日 15:33:28 作者:
最近看了javascript權(quán)威指南 里面的正則部分,match和exec方法有一些相同點和不同點,在這里寫一下加深一下印象
1. 這兩個方法,如果匹配成功,返回一個數(shù)組,匹配失敗,返回null。
2. 當RegExp的global屬性為false時,這兩個方法的返回數(shù)組是一樣的。
數(shù)組的第0個元素是整個pattern的第一個匹配字符串,接下來的元素是pattern第一個匹配中的子匹配字符串。
此外,數(shù)組還有index和input兩個額外屬性,index是匹配字符串的起始位置,input是整個輸入字符串。
此時,RegExp的lastIndex屬性一直是0。
demo:
var s = 'this is a string';
var p = /\b\w*(i)s\b/;
var rm = s.match(p);
var re = p.exec(s);
console.log('match_array: ' + JSON.stringify(rm));
console.log('match_array_index: ' + rm.index);
console.log('match_array_input: ' + rm.input);
console.log('----------------------------');
console.log('exec_array: ' + JSON.stringify(re));
console.log('exec_array_index: ' + re.index);
console.log('exec_array_input: ' + re.input);
顯示結(jié)果為(firefox控制臺):
match_array: ["this","i"]
match_array_index: 0
match_array_input: this is a string
----------------------------
exec_array: ["this","i"]
exec_array_index: 0
exec_array_input: this is a string
3. 當RegExp的global屬性為true時,返回的數(shù)組是不同的。
match方法返回的數(shù)組包含著所有匹配字符串,沒有子匹配字符串和額外屬性。此時,lastIndex屬性無效。
exec方法返回的數(shù)組格式與global為false時一樣,只是此時RegExp的lastIndex屬性有效,匹配是從lastIndex所指示的字符開始的,并且方法執(zhí)行后會將lastIndex置為本次匹配字符串的下一個字符處,所以循環(huán)執(zhí)行exec方法時會依次匹配整個字符串,直到字符串最后返回null,并將lastIndex置0。
demo:
var s = 'this is a string';
var p = /\b\w*(i)s\b/g;
var rm = s.match(p);
var re;
console.log('match_array: ' + JSON.stringify(rm));
console.log('match_array_index: ' + rm.index);
console.log('match_array_input: ' + rm.input);
while(re = p.exec(s)){
console.log('----------------------------');
console.log('exec_array: ' + JSON.stringify(re));
console.log('exec_array_index: ' + re.index);
console.log('exec_array_input: ' + re.input);
console.log('regexp_lastIndex: ' + p.lastIndex);
}
console.log('----------------------------');
console.log('exec_array: ' + re);
console.log('regexp_lastIndex: ' + p.lastIndex);
結(jié)果:
match_array: ["this","is"]
match_array_index: undefined
match_array_input: undefined
----------------------------
exec_array: ["this","i"]
exec_array_index: 0
exec_array_input: this is a string
regexp_lastIndex: 4
----------------------------
exec_array: ["is","i"]
exec_array_index: 5
exec_array_input: this is a string
regexp_lastIndex: 7
----------------------------
exec_array: null
regexp_lastIndex: 0
綜上:
1.在沒有g標識符時,match和exec方法效果是一樣的;有g標識符時,exec方法可以提供最完整的匹配結(jié)果。
2.這里順便提一下RegExp.test()方法,它是exec方法的簡化版,有匹配結(jié)果就返回true,沒有匹配結(jié)果就返回false,執(zhí)行過程與exec是一樣的。相當于 (p.exec(s) != null)。
3.RegExp的lastIndex屬性在有g標識符,且在exec和test方法中是有效的,其他地方是無效的。
2. 當RegExp的global屬性為false時,這兩個方法的返回數(shù)組是一樣的。
數(shù)組的第0個元素是整個pattern的第一個匹配字符串,接下來的元素是pattern第一個匹配中的子匹配字符串。
此外,數(shù)組還有index和input兩個額外屬性,index是匹配字符串的起始位置,input是整個輸入字符串。
此時,RegExp的lastIndex屬性一直是0。
demo:
復制代碼 代碼如下:
var s = 'this is a string';
var p = /\b\w*(i)s\b/;
var rm = s.match(p);
var re = p.exec(s);
console.log('match_array: ' + JSON.stringify(rm));
console.log('match_array_index: ' + rm.index);
console.log('match_array_input: ' + rm.input);
console.log('----------------------------');
console.log('exec_array: ' + JSON.stringify(re));
console.log('exec_array_index: ' + re.index);
console.log('exec_array_input: ' + re.input);
顯示結(jié)果為(firefox控制臺):
復制代碼 代碼如下:
match_array: ["this","i"]
match_array_index: 0
match_array_input: this is a string
----------------------------
exec_array: ["this","i"]
exec_array_index: 0
exec_array_input: this is a string
3. 當RegExp的global屬性為true時,返回的數(shù)組是不同的。
match方法返回的數(shù)組包含著所有匹配字符串,沒有子匹配字符串和額外屬性。此時,lastIndex屬性無效。
exec方法返回的數(shù)組格式與global為false時一樣,只是此時RegExp的lastIndex屬性有效,匹配是從lastIndex所指示的字符開始的,并且方法執(zhí)行后會將lastIndex置為本次匹配字符串的下一個字符處,所以循環(huán)執(zhí)行exec方法時會依次匹配整個字符串,直到字符串最后返回null,并將lastIndex置0。
demo:
復制代碼 代碼如下:
var s = 'this is a string';
var p = /\b\w*(i)s\b/g;
var rm = s.match(p);
var re;
console.log('match_array: ' + JSON.stringify(rm));
console.log('match_array_index: ' + rm.index);
console.log('match_array_input: ' + rm.input);
while(re = p.exec(s)){
console.log('----------------------------');
console.log('exec_array: ' + JSON.stringify(re));
console.log('exec_array_index: ' + re.index);
console.log('exec_array_input: ' + re.input);
console.log('regexp_lastIndex: ' + p.lastIndex);
}
console.log('----------------------------');
console.log('exec_array: ' + re);
console.log('regexp_lastIndex: ' + p.lastIndex);
結(jié)果:
復制代碼 代碼如下:
match_array: ["this","is"]
match_array_index: undefined
match_array_input: undefined
----------------------------
exec_array: ["this","i"]
exec_array_index: 0
exec_array_input: this is a string
regexp_lastIndex: 4
----------------------------
exec_array: ["is","i"]
exec_array_index: 5
exec_array_input: this is a string
regexp_lastIndex: 7
----------------------------
exec_array: null
regexp_lastIndex: 0
綜上:
1.在沒有g標識符時,match和exec方法效果是一樣的;有g標識符時,exec方法可以提供最完整的匹配結(jié)果。
2.這里順便提一下RegExp.test()方法,它是exec方法的簡化版,有匹配結(jié)果就返回true,沒有匹配結(jié)果就返回false,執(zhí)行過程與exec是一樣的。相當于 (p.exec(s) != null)。
3.RegExp的lastIndex屬性在有g標識符,且在exec和test方法中是有效的,其他地方是無效的。
相關文章
jQuery NProgress.js加載進度插件的簡單使用方法
NProgress是基于jquery的,且版本要 >1.8 。這篇文章主要介紹了NProgress.js加載進度插件的簡單使用方法,需要的朋友可以參考下2018-01-01JavaScript實現(xiàn)的簡單冪函數(shù)實例
這篇文章主要介紹了JavaScript實現(xiàn)的簡單冪函數(shù),實例分析了javascript實現(xiàn)冪運算的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04JavaScript判斷數(shù)字是否為質(zhì)數(shù)的方法匯總
這篇文章主要介紹了JavaScript判斷數(shù)字是否為質(zhì)數(shù)的方法匯總的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06javascript ES6 Template String模板字符串使用方法
這篇文章主要介紹了javascript ES6 模板字符串(Template String)是增強版的字符串,用反引號(`)標識,它可以當作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量,需要的朋友可以參考下2023-06-06JS遍歷ul下的li點擊彈出li的索引的實現(xiàn)方法
這篇文章主要介紹了JS遍歷ul下的li點擊彈出li的索引的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09Knockout結(jié)合Bootstrap創(chuàng)建動態(tài)UI實現(xiàn)產(chǎn)品列表管理
這篇文章主要為大家詳細介紹了Knockout結(jié)合Bootstrap創(chuàng)建動態(tài)UI實現(xiàn)產(chǎn)品列表管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09