更好地解决while循环中的regex.exec()赋值问题

时间:2015-08-02 21:09:48

标签: javascript regex

这里有更好的解决方案吗?我尽量避免在while内进行分配,但仍然可以遍历匹配并使用捕获的组。

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示例。

5 个答案:

答案 0 :(得分:1)

当我需要.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 :(得分:1)

如果您想避免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它更简单,并避免使用if语句中的do语句等不必要的代码。如果您了解代码的行为以及上下文的内容,那么条件中的赋值并不像人们想象的那么糟糕。

另一种情况是当你使用linter来避免将比较运算符(例如==)作为赋值运算符输入错误时,但现在使用的所有linters都支持使用注释来修改特定部分中的linter行为。代码所以这不是一个真正的问题

答案 2 :(得分: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 />";
}
&#13;
&#13;
&#13;

这将完全避免循环。 match返回一个数组。你可以循环它并用它做东西,或者像我用连接打印结果。 match接受regex-patterns

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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