2015-08-02 4 views
3

Есть ли лучшее решение для этого здесь? Я стараюсь избегать присвоения внутри while, но все же сможет прокручивать спички и использовать захваченные группы.Лучшее решение для функции regex.exec() во время цикла

var match = ""; 
var CSS_URL_PATTERN = /url\s*\(\s*["|']?(.*?)\s*["|']?\)\s*/gm 
while ((match = CSS_URL_PATTERN.exec(someBigCSSString)) !== null) { 
    // Do stuff here per match… 
} 

Я добавил немного больше контекста на этот вопрос, а также пример RegEx.

+1

Почему бы не использовать 'match'. Он вернет массив, который вы можете выполнить. Вы, как вы его разработали, теперь будут бесконечным циклом. – Mouser

+0

Что вы пытаетесь сделать в этом цикле? – eddyjs

+0

* «избегайте назначения внутри, пока» * - почему? вы можете избежать этого, но это действительно не так уж плохо. – dfsq

ответ

2

Я всегда делаю так, когда мне нужно .exec:

var re = /.../g, match; 
while (match = re.exec(...)) { 
    //... 
} 

Регулярные выражения с g флаг вызывает бесконечное действие, когда он находится в состоянии петли.

What are the differences between Fx 3.x and Fx 4.x that made many userscripts stop working?

+1

Aye ... У меня есть объявление регулярного выражения вне цикла. Изменил мой вопрос для ясности. – wittgenstein

+0

@wittgenstein, мой ответ все тот же. Я не думаю, что есть лучший и более короткий способ делать то, что вы хотите, не оставляя удобочитаемости. – w35l3y

0

var match = "Is This The Real Life|Is This Just Fantasy|Caught In A Landslide|No Escape From Reality|".match(/.+?\|/ig); 
 

 
//print result using join 
 
document.body.innerHTML += match.join("<br />"); 
 
document.body.innerHTML += "<br /><br />"; 
 
//print results using for loop and strip | 
 
for (var i = 0; i < match.length; ++i) 
 
{ 
 
    document.body.innerHTML += match[i].slice(0, -1) + "<br />"; 
 
}

Это позволит избежать цикла в целом. match возвращает массив. Вы можете зацикливать его и делать с ним что-нибудь, или, как будто я распечатывал результаты, используя join. match принимает regex-patterns.

0
var matches = someString.match(REGEX_PATTERN); 
for (var i = 0; matches && i < matches.length; i++) { 
    // Do stuff here per match… 
} 
+0

Если REGEX_PATTERN нужно захватить группы, а глобальный флаг установлен, вам нужно использовать 'RegExp.exec()' – w35l3y

+1

@ w35l3y этого не осознавал. TIL. В вопросе ничего не говорится о том, что ему нужно делать, хотя ... – Yunchi

+0

@ w35l3y Точно. Я добавил регулярное выражение к вопросу. Извините, я пропустил это, когда был изначально опубликован. – wittgenstein

0
someString.replace(REGEX_PATTERN, 
    function (wholeMatch, group1, group2/*...*/, index, sourceString) { 
     // Do stuff here per match… 
    }); 
2

Если вы хотите, чтобы избежать назначения внутри while вы можете использовать do while цикл:

var URLRegExp = /url\s*\(\s*["|']?(.*?)\s*["|']?\)\s*/g 
var match 
do { 
    match = URLRegExp.exec(bootstrap) 
    if (match) { 
    // Do stuff here per match... 
    } 
} while (match) 

Но while loop это проще и позволяет избежать unnecesary кода как if заявление внутри do , Назначение внутри условия не так плохо, как думают люди, если вы понимаете, каково поведение кода и каков контекст.

Другой случай, когда вы используете linter, чтобы избежать ошибки оператора сравнения (например, ==) в качестве оператора присваивания, но все вышеперечисленные литеры, поддерживающие использование комментариев, изменяют поведение Linter в определенной части кода, так что это не проблема

Смежные вопросы