string.match(RegExp) 与 RegExp.exec(string) 深入详解
string.match(RegExp) 与 RegExp.exec(string) 相同点与不同点对比解析:
1. 这两个方法,如果匹配成功,返回一个数组,匹配失败,返回null。
2. 当RegExp的global属性为false时,这两个方法的返回数组是一样的。
数组的第0个元素是整个str的第一个匹配字符串,接下来的元素是str第一个匹配中的子匹配字符串。
此外,数组还有index和input两个额外属性,index是匹配字符串的起始位置,input是整个输入字符串。
此时,RegExp的lastIndex属性一直是0(可为什么跟下面测试结果不一样呢?)。
实例01(不带g标识符):
1 <script type="text/JavaScript"> 2 3 var str="this is a string"; 4 5 var reg=/\b\w*(i)s\b/; 6 7 var rm=str.match(reg); 8 9 var re=reg.exec(str); 10 11 document.write("string.match(RegExp)测试结果:<br\>"); 12 13 document.write("string.match(RegExp)返回数组:"+rm+"<br\>"); 14 15 document.write("string.match(RegExp).index:"+rm.index+"<br\>"); 16 17 document.write("string.match(RegExp).input:"+rm.input+"<br\>"); 18 19 document.write("string.match(RegExp).lastIndex:"+reg.lastIndex+"<br\>"); 20 21 document.write("===============================<br\>"); 22 23 document.write("RegExp.exec(string)测试结果:<br\>"); 24 25 document.write("RegExp.exec(string)返回数组:"+re+"<br\>"); 26 27 document.write("RegExp.exec(string).index:"+re.index+"<br\>"); 28 29 document.write("RegExp.exec(string).input:"+re.input+"<br\>"); 30 31 document.write("RegExp.exec(string).lastIndex:"+reg.lastIndex+"<br\>"); 32 33 </script> 34 35 输出结果: 36 37 string.match(RegExp)测试结果: 38 39 string.match(RegExp)返回数组:this,i 40 41 string.match(RegExp).index:0 42 43 string.match(RegExp).input:this is a string 44 45 string.match(RegExp).lastIndex:4 46 47 =============================== 48 49 RegExp.exec(string)测试结果: 50 51 RegExp.exec(string)返回数组:this,i 52 53 RegExp.exec(string).index:0 54 55 RegExp.exec(string).input:this is a string 56 57 RegExp.exec(string).lastIndex:4 58 59
3. 当RegExp的global属性为true时,返回的数组是不同的。
match()方法返回的数组包含着所有匹配字符串,没有子匹配字符串和额外属性(为什么下面实际测试是有index和input额外属性的呢?而且index的数值是最后一个匹配字符串的位置?)。此时,lastIndex属性无效。
exec()方法返回的数组格式与global为false时一样,只是此时RegExp的lastIndex属性有效,匹配是从lastIndex所指示的字符开始的,并且方法执行后会将lastIndex置为本次匹配
字符串的下一个字符处,所以循环执行exec方法时会依次匹配整个字符串,直到字符串最后返回null,并将lastIndex置0。
注:下面的测试代码必须设置两个RegExp变量(reg1,reg2),否则re始终为null,while(){}循环内部始终进不去,至于原因,暂时不知道!!!!!!
实例02(带g标识符):
1 <script type="text/JavaScript"> 2 var str="this is a string"; 3 var reg1=/\b\w*(i)s\b/g; 4 var reg2=/\b\w*(i)s\b/g; 5 var rm = str.match(reg1); 6 var re; 7 document.write("string.match(RegExp)带全局变量g 测试结果:<br\>"); 8 document.write("string.match(RegExp)返回数组:"+rm+"<br\>"); 9 document.write("string.match(RegExp).index:"+rm.index+"<br\>"); 10 document.write("string.match(RegExp).input:"+rm.input+"<br\>"); 11 document.write("string.match(RegExp).lastIndex:"+reg1.lastInde+"<br\>"); 12 13 document.write("==========================================<br\>"); 14 document.write("RegExp.exec(string)带全局变量g 测试结果:<br\>"); 15 while(re=reg2.exec(str)) 16 { 17 document.write("RegExp.exec(string)返回数组:"+re+"<br\>"); 18 document.write("RegExp.exec(string).index:"+re.index+"<br\>"); 19 document.write("RegExp.exec(string).input:"+re.input+"<br\>"); 20 document.write("RegExp.exec(string).lastIndex:"+reg2.lastIndex+"<br\>"); 21 document.write("----------------------------------------<br\>"); 22 23 } 24 document.write("RegExp.exec(string)循环完成后返回数组:"+re+"<br\>"); 25 document.write("RegExp.exec(string).lastIndex:"+reg2.lastIndex+"<br\>"); 26 27 </script> 28 29 输出结果: 30 31 string.match(RegExp)带全局变量g 测试结果: 32 string.match(RegExp)返回数组:this,is 33 string.match(RegExp).index:5 34 string.match(RegExp).input:this is a string 35 string.match(RegExp).lastIndex:undefined 36 ========================================== 37 RegExp.exec(string)带全局变量g 测试结果: 38 RegExp.exec(string)返回数组:this,i 39 RegExp.exec(string).index:0 40 RegExp.exec(string).input:this is a string 41 RegExp.exec(string).lastIndex:4 42 ---------------------------------------- 43 RegExp.exec(string)返回数组:is,i 44 RegExp.exec(string).index:5 45 RegExp.exec(string).input:this is a string 46 RegExp.exec(string).lastIndex:7 47 ---------------------------------------- 48 RegExp.exec(string)循环完成后返回数组:null 49 RegExp.exec(string).lastIndex:0
综上:
1.在没有g标识符时,match和exec方法效果是一样的;有g标识符时,exec方法可以提供最完整的匹配结果。
2.这里顺便提一下RegExp.test()方法,它是exec方法的简化版,有匹配结果就返回true,没有匹配结果就返回false,执行过程与exec是一样的。相当于 (p.exec(s) != null)。
3.RegExp的lastIndex属性在有g标识符,且在exec和test方法中是有效的,其他地方是无效的(可实际上在string.match(RegExp)不带g标识符的方法中,也是有效的,参看上面 代码01)。