鍍金池/ 問答/Java  網(wǎng)絡安全  HTML/ 關于正則的一些問題

關于正則的一些問題

遇到一個死循環(huán)的代碼,求大神解釋一下原因,謝謝!

<script>
        var str = '110報警120急救119火警114查詢';
        var pattern = /\d*/g //排查定位好像是這里的原因,陷入死循環(huán)
        var total = 0,
            match ='',
            result;
        while((result = pattern.exec(str))!=null){
            match +=result[0]+','
            
        }
        console.log(match);
    
    </script>
回答
編輯回答
久不遇

正則改成/\d+/g
/\d*/g可以匹配0個數(shù)字,所以就不會停止,死循環(huán)了


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來循環(huán),我就一直給你空字符串)。


正則用于匹配符合一定模式的字符串。
比如/b表示單詞邊界,/string\b/g.test("strings")false,是因為字符串stringsg后還有s所以不是單詞邊界。/string\b/g.test("string~~~")true因為g后面接~,單詞已經(jīng)結束了。
但是這不能說g~間有一個單詞邊界/b這樣的東西。字符串只是簡單的一串字符,string~~~只是s、t、r...~這樣一串字符在一起。 /b是否存在是正則表達式解析程序發(fā)現(xiàn)你的string~~~string~~~,在string就已經(jīng)結束了一個單詞,所以它判定你這個字符串符合/string\b/g這樣的模式。

2018年1月18日 11:28
編輯回答
毀與悔
var reg = /\d+/g;
var str = '110報警120急救119火警114查詢';
var result = str.match(reg).join(',');

就一個需求還能接觸死循環(huán),也是醉了。。。

牛逼一點的

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

2017年10月1日 23:27