正則常用的一些方法
1. test()
regexp.test(str)
作用: 檢測一個(gè)字符串是否匹配某個(gè)正則娜庇。滿足返回true,否則返回false再登。此方法的返回結(jié)果會(huì)受到是否加全局標(biāo)志g
的影響
未加全局g測試代碼:
var regexp = /^1[3-9]\d{9}$/; // 手機(jī)號(hào)正則
console.log( regexp.lastIndex ); // 0
console.log( regexp.test('13588888888') ); // true
console.log( regexp.lastIndex ); // 0
console.log( regexp.test('18588888888') ); // true
console.log( regexp.lastIndex ); // 0
console.log( regexp.test('12588888888') ); // false 第2位不滿足
lastIndex
屬性是正則下次往后匹配的起始位置
可見,未加全局g,則lastIndex屬性值一直從0開始往后匹配付秕。
加全局g測試代碼:
var regexp = /^1[3-9]\d{9}$/g;
console.log( regexp.lastIndex ); // 0 默認(rèn)從下標(biāo)0向后匹配
console.log( regexp.test('13588888888') ); // true
console.log( regexp.lastIndex ); // 11 后面往后匹配的下標(biāo)位置
console.log( regexp.test('13588888888') ); // false
console.log( regexp.lastIndex); // 0 上面匹配失敗下標(biāo)重置為0
console.log( regexp.test('13588888888') ); // true
//如此循環(huán)著此過程
可見兰珍,加全局g的時(shí)候,lastIndex屬性的值會(huì)受到test方法的影響询吴。導(dǎo)致每次往后匹配的下標(biāo)值是不一樣的掠河,若多次調(diào)用test方法會(huì)重復(fù)上面的過程。
若想每次都從下標(biāo)0開始往后匹配汰寓,只需調(diào)用test前把lastIndex屬性重置為0即可口柳。
regexp.lastIndex = 0 ; // 重置為0
console.log( regexp.test('13588888888') ); // true
所以一般判斷一個(gè)字符串是否滿足一個(gè)正則,即對(duì)于結(jié)果是true或false的情況有滑,此時(shí)正則建議不加全局g,這可讓lastIndex屬性每次都是從0開始向后匹配跃闹。
2. exec()
regexp.exec(str)
作用: 返回正則匹配的結(jié)果,以一個(gè)數(shù)組返回 毛好。此數(shù)組第一個(gè)元素(下標(biāo)0)是正則相匹配的字符串望艺,后面的下標(biāo)元素依次是括號(hào)中捕獲組匹配的內(nèi)容。未匹配到則返回null
此方法和test一樣肌访,其返回結(jié)果都會(huì)受到正則全局標(biāo)識(shí)g
的影響找默。
未全局g測試:
var regexp = /(\d{3})\d{4}(\d{4})/;
regexp.exec('13588888888') ; // ["13588888888", "135", "8888", index: 0, input: "13588888888"]
regexp.lastIndex; // 0
regexp.exec('13588888888') ; // ["13588888888", "135", "8888", index: 0, input: "13588888888"]
regexp.lastIndex; // 0
regexp.exec('13588888888') ; // ["13588888888", "135", "8888", index: 0, input: "13588888888"]
可見,匹配的結(jié)果都是一樣的吼驶,結(jié)果為:[13588888888'惩激,'135','8888']
下標(biāo)0
為1358888888是正則匹配的結(jié)果蟹演。
下標(biāo)1
為135是正則第1
個(gè)捕獲組匹配的結(jié)果风钻。
下標(biāo)2
為8888是正則第2
個(gè)捕獲組匹配的結(jié)果。
...
多個(gè)捕獲組的匹配結(jié)果以此類推
加全局g測試:
var regexp = /(\d{3})\d{4}(\d{4})/g;
regexp.lastIndex; // 0
regexp.exec('13588888888'); // ["13588888888", "135", "8888", index: 0, input: "13588888888"]
regexp.lastIndex; // 11
regexp.exec('13588888888'); // null
regexp.lastIndex; // 0
regexp.exec('13588888888'); // ["13588888888", "135", "8888", index: 0, input: "13588888888"]
結(jié)果和上面未加g代碼測試結(jié)果一樣酒请,只是每次調(diào)用exec方法骡技,其正則對(duì)象lastIndex屬性值的下次起始匹配位置都會(huì)改變,這個(gè)變化和test方法是一樣的。
while循環(huán)exec方法
當(dāng)正則加了全局標(biāo)識(shí)g時(shí)布朦,若要使用exec方法獲取正則匹配的所有結(jié)果囤萤,一次次調(diào)用exec顯然不行的,因?yàn)槠ヅ涑晒蜁?huì)停止是趴,再次通過lastIndex屬性的下標(biāo)值繼續(xù)往后匹配涛舍,因此不知道要調(diào)用多少次exec方法才可獲得匹配的所有結(jié)果,一般做法是使用while循環(huán)exec方法唆途,直到未匹配為止做盅。
如下:
var str = '13423455678php18912345678';
var reg = /(\d{3})\d{4}(\d{4})/g;
var result = [];
var row;
while( row = reg.exec(str)){
result.push(row);
}
console.log( result );
結(jié)果: