这里有更好的解决方案吗?我尽量避免在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示例。
答案 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;
这将完全避免循环。 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…
});