exec是RegExp的方法,而match是js字符串的方法。两个方法执行是有所不同的。
第一个示例的pattern带有全局标识g,但是该g没有对exec方法起作用,返回得结果是匹配的第一个串,以及各个分组的匹配结果的反向引用。而match方法,返回的是全局中匹配的每个子串
第二个示例去掉了pattern的全局标识g,g对match方法起了作用,没有g的时候,两个方法返回的结果是一样的
第一个示例:
var someText= "web2.0 .net2.0" ;
var pattern=/(\w+)(\d)\.(\d)/g;
var outCome_exec=pattern.exec(someText);
var outCome_matc=someText.match(pattern);
outCome_exec
["web2.0", "web", "2", "0"]
outCome_matc
["web2.0", "net2.0"]
</pre><pre name="code" class="javascript">
<strong><span style="font-size:18px;">第二个示例:</span></strong>
var someText= "web2.0 .net2.0" ;
var pattern=/(\w+)(\d)\.(\d)/;
var outCome_exec=pattern.exec(someText);
var outCome_matc=someText.match(pattern);
outCome_matc
["web2.0", "web", "2", "0"]
outCome_exec
["web2.0", "web", "2", "0"]
总结:在模式没有指定g时,exec和match返回的结果是一样的,都是匹配的第一个子串以及分组的引用;
在指定g的时候,exec和match的结果不一样,前者还是返回匹配的第一个子串以及分组的引用,但是对于match会返回全局的匹配的子串,而没有分组信息。
exec不受g标识的影响,而match会受g标识的影响
问题来了,如果想使用exec去匹配整个串,怎么办?答案就是通过循环,每次都会匹配一个结果。
var someText= "web2.0 .net2.0" ;
var pattern=/(\w+)(\d)\.(\d)/g;
while(match=pattern.exec(someText)){console.log(match)}
<span style="font-family: Arial, Helvetica, sans-serif;">结果:["web2.0", "web", "2", "0", index: 0, input: "web2.0 .net2.0"] </span><span style="font-family: Arial, Helvetica, sans-serif;">["net2.0", "net", "2", "0", index: 8, input: "web2.0 .net2.0"]</span>