RegExp 的 exec() 函数和 String 的 match() 函数有什么区别?
2022-08-30 04:04:08
如果我运行这个:
/([^\/]+)+/g.exec('/a/b/c/d');
我得到这个:
["a", "a"]
但是如果我运行这个:
'/a/b/c/d'.match(/([^\/]+)+/g);
然后我得到这个的预期结果:
["a", "b", "c", "d"]
有什么区别?
如果我运行这个:
/([^\/]+)+/g.exec('/a/b/c/d');
我得到这个:
["a", "a"]
但是如果我运行这个:
'/a/b/c/d'.match(/([^\/]+)+/g);
然后我得到这个的预期结果:
["a", "b", "c", "d"]
有什么区别?
exec
使用全局正则表达式是为了在循环中使用,因为它仍将检索所有匹配的子表达式。所以:
var re = /[^\/]+/g;
var match;
while (match = re.exec('/a/b/c/d')) {
// match is now the next match, in array form.
}
// No more matches.
String.match
为您执行此操作并丢弃捕获的组。
一张图片更好,你知道...
re_once = /([a-z])([A-Z])/
re_glob = /([a-z])([A-Z])/g
st = "aAbBcC"
console.log("match once="+ st.match(re_once)+ " match glob="+ st.match(re_glob))
console.log("exec once="+ re_once.exec(st) + " exec glob="+ re_glob.exec(st))
console.log("exec once="+ re_once.exec(st) + " exec glob="+ re_glob.exec(st))
console.log("exec once="+ re_once.exec(st) + " exec glob="+ re_glob.exec(st))
看到区别了吗?
注意:为了突出显示,请注意捕获的组(例如:a,A)在匹配的模式(例如:aA)之后返回,而不仅仅是匹配的模式。