关于javascript 正则中连续执行返回null的问题

最近在使用javascript 判断是否是手机浏览器中遇到一个问题

/*根据浏览器跳转 */
function checkBroswer() {
    var broswerType = navigator.userAgent.toLowerCase();
    var url = window.location.href.toLowerCase();
    if (broswerType.indexOf("android") > -1 || broswerType.indexOf("iphone") > -1 || broswerType.indexOf("micromessenger") > -1) {
        /*判断是否是新闻类*/
        if (url.indexOf("news.") > -1) {
            var newsReg = /^http:\/\/news.*\d+-(\d+)\.html$/g;
          
            if (newsReg.test(url)) {
              
                location.href = "http://xx.info?id=" + newsReg.exec(url)[1];
            } else {

                location.href = "http://xx.com/list";
            }
        

        }

发现先使用test判断是否匹配,再使用exec获取id时,尽然返回为null。如果再前面执行一次exec,再执行可返回数据

 console.log(newsReg.exec(url));
 location.href = "http://x.com/info?id=" + newsReg.exec(url)[1];

就想到可能是不能同时使用test,再使用exec,于是修改为以下代码,只使用exec,不使用test来完成功能

  var newsReg =/^http:\/\/news[^\d]+\d+-(\d+)\.html$/g;
            var result=newsReg.exec(url);
            if (result!=null) {
              location.href = "http://m.chinayq.com/pages/news/info?id=" +result[1];
            } else {
                location.href = "http://m.chinayq.com/pages/news/list";
            }

  

相关解释:

在全局模式下,当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把正则表达式对象的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

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

 
<script type="text/javascript"> 
var pattern = /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> 

参考文档:https://www.jb51.net/article/28998.htm

原文地址:https://www.cnblogs.com/fogwang/p/15775974.html