RegExp 对象包含两种方法:test()和exec(),功能基本相似,用于测试字符串匹配。
test()方法在字符串中查找是否存在指定的正则表达式并返回布尔值。存在返回true,反之返回false。
exec()方法也用于在字符串中查找指定的正则表达式,如果exec方法执行成功则返回包含查找字符串的相关信息数组。如果执行失败返回null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。
但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
例如:
var pattern = new RegExp('box','ig');
var str = 'this is a box ';
alert(pattern.test(str));
alert(pattern.test(str));
两次alert的结果你会发现第一次是true,第二次是false,为什么呢?
去w3c查一下RegExp对象还有一个lastIndex 是一个整数,标示开始下一次匹配的字符位置。
让我么在将后面的两行alert替换成:
alert(pattern.lastIndex); //0
alert(pattern.test(str));//true
alert(pattern.lastIndex);//13
alert(pattern.test(str));//false
原来加上参数gRegExp对象的lastIndex不会自动归零直到第一次匹配失败,所以会出现true和false交替出现的情况。