最近在看某知名js框架的源码,突然间发现自己对exec()方法竟然不太理解,然后就仔细的分析了一下这个方法
下面贴个exec()方法使用的代码出来
rquickExpr = /^(?:s*(<[wW]+>)[^>]*|#([w-]*))$/;
match = rquickExpr.exec( selector );
exec() 方法就是用来检索字符串中正则表达式的匹配,如果匹配到了那么就返回一个存放有结果的数组,如果没有匹配到就返回一个null
(个人感觉这个方法和php里面的preg_match特别像啊~O(∩_∩)O哈哈~)
exec() 方法使用起来比test方法和String对象的match方法要复杂的多
在这里说一下test方法和String对象的match方法
test()用于检测一个字符串是否匹配某个模式,也是一个正则匹配的方法,但是test()方法只会返回有没有匹配到规定的字符串,匹配到了就返回true。没有那么就返回false。
match()方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
match和test的区别在于它可以直接检测字符串中是不是含有某个值,而不需使用正则表达式,第二个区别就是match函数可以进行一次或多次模式匹配,将匹配结果按照一个数组进行返回。(使用单次匹配还是多次匹配这取决于在匹配模式中是否含有g,我自己感觉没有g的就相当于php里面的preg_match函数,有的就相当于preg_match_all函数,哈哈)
exec方法返回的数组的第 0 个元素是与正则表达式相匹配的文本
第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话)
第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话)
...
以此类推。
除了数组元素和 length 属性之外,exec() 方法还返回两个属性。
index 属性声明的是匹配文本的第一个字符的位置。
input 属性则存放的是被检索的字符串 string。
我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。
但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。
它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。
当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。
lastIndex属性的意思就是当前匹配的字符串的最后一个字符的位置,比如说要在"abcdefg"中匹配"bcd",那么第一次匹配完成后的lastIndex就是4~
这就是说,你可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。
当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
需要注意的是,如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。