RegExp的exec()函数和String的match()函数有什么区别?
如果我运行这个:
/([^\/]+)+/g.exec('/a/b/c/d');
我得到这个:
["a", "a"]
但是,如果我运行这个:
'/a/b/c/d'.match(/([^\/]+)+/g);
然后我得到这个预期的结果:
["a", "b", "c", "d"]
有什么不同?
exec
全局正则expression式是为了在循环中使用,因为它仍然会检索所有匹配的子expression式。 所以:
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 = /([az])([AZ])/ re_glob = /([az])([AZ])/g st = "aAbBcC" document.write("<pre>") document.write("<br>match once="+ st.match(re_once)+ " match glob="+ st.match(re_glob)) document.write("<br> exec once="+ re_once.exec(st) + " exec glob="+ re_glob.exec(st)) document.write("<br> exec once="+ re_once.exec(st) + " exec glob="+ re_glob.exec(st)) document.write("<br> exec once="+ re_once.exec(st) + " exec glob="+ re_glob.exec(st))
/regex/.exec()
只返回find的第一个匹配,而"string".match()
返回所有这些,如果你在正则expression式中使用g
标志。
看到这里: exec , match 。
如果你的正则expression式是全局的,而你正在捕获,那么你必须使用exec。 匹配不会返回所有的捕获。
匹配适用于匹配时(非捕获)。 你运行一次,它会给出所有匹配的数组。 (尽pipe如果正则expression式不是全局的,那么匹配将显示匹配,然后捕获)
执行是你捕捉时使用的,每次执行时都会给出匹配,然后是捕捉。 (匹配的行为方式是只在正则expression式不是全局的情况下给出完整匹配,然后是捕获。
Exec的另一个用途是获取匹配的索引或位置。 当你有一个正则expression式的variables,你可以使用.lastIndex并获得匹配的位置。 一个正则expression式对象有.lastIndex,正则expression式对象就是你执行的.exec。 点匹配是在一个string上完成的,你将无法做正则expression式对象点lastIndex
一个string,有匹配函数,这是传递一个正则expression式。 一个正则expression式,具有exec函数,并传递一个string
exec你运行多次。 匹配你运行一次
在捕获时使用匹配是很好的,捕获的时候可以使用更强大的exec,因为捕获是非常好的,但是如果捕获时使用了匹配,那么当正则expression式不是全局的时候,当正则expression式是全局的时候不显示捕获。
> "azb".match(/a(z)b/); [ "azb", "z" ] > "azb".match(/a(z)b/g); [ "azb" ] >
另一件事是,如果你使用exec,注意在正则expression式上调用,那么如果你使用正则expression式的variables,你有更多的权力
当你不使用正则expression式的variables时,你不会得到匹配,所以当使用exec时使用正则expression式的variables
> /./g.exec("abc") [ "a" ] > /./g.exec("abc") [ "a" ] > /./g.exec("abc") [ "a" ] > > /[ac]/g.exec("abc") [ "a" ] > /[ac]/g.exec("abc") [ "a" ] > > var r=/[ac]/g > r.exec("abc") [ "a" ] > r.exec("abc") [ "b" ] > r.exec("abc") [ "c" ] > r.exec("abc") null >
用exec,你可以得到匹配的“索引”
> var r=/T/g > r.exec("qTqqqTqqTq"); [ "T" ] > r.lastIndex 2 > r.exec("qTqqqTqqTq"); [ "T" ] > r.lastIndex 6 > r.exec("qTqqqTqqTq"); [ "T" ] > r.lastIndex 9 > r.exec("qTqqqTqqTq"); null > r.lastIndex 0 >
所以,如果你想索引或捕获,然后使用exec(记住,正如你所看到的,用“索引”,它给出的“索引”实际上是第n次出现,它从1开始计数。所以你可以推导出适当的索引通过减去1。正如你可以看到它给0 – lastIndex 0 – 未find)。
如果你想扩展匹配,你可以在捕获时使用它,但是当正则expression式是全局的时候,当你这样做的时候,数组的内容不是全部匹配的,而是满的比赛之后的捕获。