关于正则的一些问题

遇到一个死循环的代码,求大神解释一下原因,谢谢!

<script>
        var str = '110报警120急救119火警114查询';
        var pattern = /\d*/g //排查定位好像是这里的原因,陷入死循环
        var total = 0,
            match ='',
            result;
        while((result = pattern.exec(str))!=null){
            match +=result[0]+','
            
        }
        console.log(match);
    
    </script>
阅读 3.4k
2 个回答

正则改成/\d+/g
/\d*/g可以匹配0个数字,所以就不会停止,死循环了


MDN 正则表达式
正则表达式用于匹配符合一定模式的字符串
*表示匹配前一个表达式0次或多次。
所以/c/g.test("a string")表示字符串"a string"是否有一个c,而/c*/g.test("a string")表示字符串"a string"是否至少有0个c。显然至少有0个是绝对绝对会成立的。所以/c*/g.exec("a string")在一开始就会匹配成功(因为你需要至少0个,就算我开头是a,我返回给你0个c`也就是空字符串也符合你要求,如果你用while来循环,我就一直给你空字符串)。


正则用于匹配符合一定模式的字符串。
比如/b表示单词边界,/string\b/g.test("strings")false,是因为字符串stringsg后还有s所以不是单词边界。/string\b/g.test("string~~~")true因为g后面接~,单词已经结束了。
但是这不能说g~间有一个单词边界/b这样的东西。字符串只是简单的一串字符,string~~~只是str...~这样一串字符在一起。 /b是否存在是正则表达式解析程序发现你的string~~~string~~~,在string就已经结束了一个单词,所以它判定你这个字符串符合/string\b/g这样的模式

var reg = /\d+/g;
var str = '110报警120急救119火警114查询';
var result = str.match(reg).join(',');

就一个需求还能接触死循环,也是醉了。。。

牛逼一点的

function parse(str) {
    var at = 0, len = str.length, results = [];
    while (at < len) {
        var ch = str[at];
        if (/\d/.test(ch)) {
            var number = '';
            while (ch && /\d/.test(ch)) {
                number += ch;
                ch = str[++at];
            }
            number = parseFloat(number, 10);
            results.push(number);
        }
        at++;
    }
    return results;
}

正则表达式?我们不需要正则表达式,我们只要一个NFA

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题