zl程序教程

您现在的位置是:首页 >  前端

当前栏目

Javascript中使用exec进行正则表达式全局匹配时的注意事项

JavaScript正则表达式 使用 进行 注意事项 匹配 全局 exec
2023-06-13 09:14:31 时间
本文就是介绍在使用Javascript中使用exec进行正则表达式全局匹配时的注意事项。
先看一下常见的用法:
复制代码代码如下:

<scripttype="text/javascript">
varpattern=/http:\/\/([^\/\s]+)/;
alert(pattern.exec("http://www.codebit.cn"));//http://www.codebit.cn,www.codebit.cn
alert(pattern.exec("http://YITU.org"));//http://YITU.org,YITU.org
//也可以直接写成/http:\/\/([^/]+)/.exec("http://www.codebit.cn");
</script>

接下来看一下全局模式下的诡异事件:
复制代码代码如下:

<scripttype="text/javascript">
varpattern=/http:\/\/([^\/\s]+)/g;//使用了g修饰符
alert(pattern.exec("http://www.codebit.cn"));//http://www.codebit.cn,www.codebit.cn
alert(pattern.exec("http://YITU.org"));//并没有返回期望的http://YITU.org,YITU.org,而是返回了null
</script>

第二个语句并没有返回期望的结果,而是返回了null,这是因为:
在全局模式下,当exec()找到了与表达式相匹配的文本时,在匹配后,它将把正则表达式对象的lastIndex属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用exec()方法来遍历字符串中的所有匹配文本。当exec()再也找不到匹配的文本时,它将返回null,并把lastIndex属性重置为0。
下面是正常的全局模式下的匹配方式:
复制代码代码如下:
<scripttype="text/javascript">
varpattern=/http:\/\/([^\/\s]+)/g;
varstr="CodeBit.cn:http://www.codebit.cn|YITU.org:http://YITU.org";
varresult;
while((result=pattern.exec(str))!=null){
alert("Result:"+result+"LastIndex:"+pattern.lastIndex);
}
//Result:http://www.codebit.cn,www.codebit.cnLastIndex:34
//Result:http://YITU.org,YITU.orgLastIndex:67
</script>

从上面的代码我们可以看到,之所以出现第二段代码中的问题,影响因素是lastIndex,所以我们可以通过将lastIndex手动置0的方式来解决这个问题。
复制代码代码如下:
<scripttype="text/javascript">
varpattern=/http:\/\/([^\/\s]+)/g;//使用了g修饰符
alert(pattern.exec("http://www.codebit.cn"));//http://www.codebit.cn,www.codebit.cn
pattern.lastIndex=0;
alert(pattern.exec("http://YITU.org"));//http://YITU.org,YITU.org
</script>

总结:
在全局模式下,如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把lastIndex属性重置为0。