exec为正则表达式方法,match为字符串方法
a:exec
exex为正则表达式的方法。如果没有找到匹配则返回null,如果找到匹配则返回一个数组并更新全局的RegExp对象的属性【数组0元素包含了完整的匹配项,而从1~N包含的是匹配中出现的任意一个子项的匹配。这相当于没有设置全局标志(g)的match方法】
1 2 3 var str = "<a href='//www.baidu.com'>fasdf</a>"; 4 5 6 7 var reg = /(<(\w+)\s* [^>]*>)\w*(<\/\2>)?/; 8 9 10 11 var list = reg.exec(str); 12 13 14 15 console.log(list);
正则子项匹配情况:
返回数据为数组:
第0项:是满足正则的所有匹配(的字符) "<a href='//www.baidu.com'>fasdf</a>"
第1项:第一个子表达式的匹配项的值"<a href='//www.baidu.com'>"
第2项:第二个子表达式的匹配值"a"
第3项:第三个子表达式的匹配值"</a>"
说明:正则中的\2表示对第二个匹配项的引用【同理\1是对第一个正则字表达是的引用】
exec只执行一次匹配,即使有全局标识,所以要想获得更多的匹配必须使用while循环
1 var reg = /(<(\w+)\s*[^>]*>)\w*(<\/\2>)?/g; 2 3 while ((list = reg.exec(str)) !== null){ 4 5 var msg = "Found " + list[0] + ". "; 6 7 msg += "Next match starts at " + list.index; 8 9 console.log(list); 10 11 }
执行结果:
注:虽说是while循环,可正则仍需要为全局的,否则会就如死循环,一直循环第一项。
b:关于match
match是字符串的方法,str.match(reg);
理论:1>如果 match 方法没有找到匹配,返回 null。如果找到匹配返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果
2>如果没有设置全局标志 (g),数组的 0 元素包含整个匹配,而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志,元素 0 到 n 中包含所有匹配。
没有加全局标识的时候:
1 var str = "<a href='//www.baidu.com'>fasdf</a><b ></b>"; 2 3 4 5 var reg = /(<(\w+)\s* [^>]*>)\w*(<\/\2>)?/; 6 7 8 9 console.log(str.match(reg));
执行结果:
注:当没有全局标识的时候,只执行一次。
1 var str = "<a href='//www.baidu.com'>fasdf</a><b ></b>"; 2 3 4 5 var reg = /(<(\w+)\s* [^>]*>)\w*(<\/\2>)?/g; 6 7 8 9 console.log(str.match(reg));
执行结果:
如果有全局变量的话,则单单返回完全匹配的数据
总结:当RegExp没有全局标识的时候,exec和match是等价的,而有有全局标识的时候,exec需要使用while循环来获取匹配的数组,并且每个数据的项都包含了具体匹配的值中子项匹配情况,每次匹配的位置等情况
而match仅仅返回匹配的数组。
如果想要获取更多的匹配信息,还需要使用exec【while】
1 var str = "<a href='//www.baidu.com'>fasdf</a><b ></b>"; 2 3 4 5 var reg = /(<(\w+)\s* [^>]*>)\w*(<\/\2>)?/g; 6 7 8 9 console.log(str.replace(reg, "<p>$&</p>"));
执行结果: