首页 > javascript 正则前瞻 如何完整匹配这个8位数字

javascript 正则前瞻 如何完整匹配这个8位数字

想把 window.location.hash 中的纯8位数字匹配出来,可正则前瞻似乎javascript不支持。
如何实现这个功能:匹配出完整的8位数字。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>



<script>

    function getValue(str) {
        var m = str.match(/(?:\D)(\d{8})(?:\D)/);
        return m && m[2] ? m[2] : '';
    }

    var strArr = [
        '10208899', //有
        '#10208899', //有
        '#test10208899', //有
        '#ff1020889900',//无
        '#0010208899',//无
        '#1020^10208899a',//有
        '#5566880&10208899f',//有
        'test?#10208899',//有
        '#10208899.'//有
    ];
    for (var i in strArr) {
        var id = getValue(strArr[i]);
        console.log(i, "\t", strArr[i], "\t", id);
    }

</script>


</body>
</html>

还是不太明白题主的意思
像'#ff1020889900'这种情况,不能匹配是正确的结果,因为8位数字'10208899'之后还是数字,所以\D就无法匹配,整个正则表达式就无法匹配成功了。

如果题主的意思是完整的8位数字的,就像你现在使用非捕获分组就够了,只是差一点。
我的建议是
(?:\D|)(\d{8})(?:\D|)分别在非捕获分组中多加了一个分支用于匹配空字符情况,
这样就能匹配
10208899的情况了。

为此可以使用专门为捕获分组设计的exec方法。

function getValue(str) {
 var m = /(?:\D|)(\d{8})(?:\D|)/.exec(str);
 return m ? m[1] : '';
}

几个问题:

  1. 前后除了\D,还需要^和$匹配行首和行尾的情况
  2. 既然都非捕获组了,前后两个并不会作为结果返回,m就应该取1才对
    所以最终结果或者是
    /(?:\D|^)(\d{8})(?:\D|$)/ return m ? m[1]
    或者
    /(\D|^)(\d{8})(\D|$)/ return m && m[2] ? m[2]
【热门文章】
【热门文章】