在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

關(guān)于正則的一些問題

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

<script>
        var str = '110報(bào)警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個(gè)數(shù)字,所以就不會(huì)停止,死循環(huán)了


MDN 正則表達(dá)式
正則表達(dá)式用于匹配符合一定模式的字符串。
*表示匹配前一個(gè)表達(dá)式0次或多次。
所以/c/g.test("a string")表示字符串"a string"是否有一個(gè)c,而/c*/g.test("a string")表示字符串"a string"是否至少有0個(gè)c。顯然至少有0個(gè)是絕對(duì)絕對(duì)會(huì)成立的。所以/c*/g.exec("a string")在一開始就會(huì)匹配成功(因?yàn)槟阈枰辽?個(gè),就算我開頭是a,我返回給你0個(gè)c`也就是空字符串也符合你要求,如果你用while來循環(huán),我就一直給你空字符串)。


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

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

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

牛逼一點(diǎ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;
}

正則表達(dá)式?我們不需要正則表達(dá)式,我們只要一個(gè)NFA

2017年10月1日 23:27