text / exec方法
text()
var reg1 = /w/;
var reg2 = /w/g;
reg1.test('a') === true reg2.test('a') === true
reg1.test('a') === true reg2.test('a') === false
reg1.test('a') === true reg2.test('a') === true
lastIndex在作怪
while(reg1.test('ab')){
console.log(reg1.lastIndex) // 0 0 0 0...
}
while(reg2.test('ab')){
console.log(reg2.lastIndex) // 1 2
}
解决办法:
- (/w/g).test('a') 每次都实例化一个新的规则,但是会增加内存开销,不建议
- reg2使用reg1模式,不需要加'g'全文搜索
exec()
非全局调用
- 调用非全局的RegExp对象的exec()时,返回数组
-
第一个元素是与正则表达式相匹配的文本
-
第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话)
-
第三个元素是与RegExpObject的第二个子表达式相匹配的文本(如果有的话)
-
。。。以此类推
var reg3 = /d(w)d/; //非全局
var reg4 = /d(w)d/g;
var ts = '1a2b3c4d5e';
var ret = reg3.exec(ts); // 匹配到的结果数组 ['1a2','a']
console.log(reg3.lastIndex + ' ' + ret.index + ' ' + ret.toString());
// "0 0 12a,a"
//非全局下lastIndex不生效,第二个0代表'第一个匹配结果是从下标为0的位置开始',匹配的结果数组转化为字符串
console.log(reg3.lastIndex + ' ' + ret.index + ' ' + ret.toString()); // "0 0 12a,a"
while(ret = reg4.exec(ts)){
console.log(reg4.lastIndex + ' ' + ret.index + ' ' + ret.toString());
//"3 0 1a2,a" "7 4 3c4,c"
}
整理自慕课网教学 点此进入