Javascript while循环中regex.exec()赋值的更好解决方案
这里有更好的解决办法吗?我尽量避免Javascript while循环中regex.exec()赋值的更好解决方案,javascript,regex,Javascript,Regex,这里有更好的解决办法吗?我尽量避免中的赋值,但仍然能够循环匹配并使用捕获的组 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… } 我为这个问题添加了更多的上下文,也是一个正则表达式示例。 v
中的赋值,但仍然能够循环匹配并使用捕获的组
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…
}
我为这个问题添加了更多的上下文,也是一个正则表达式示例。
var match=“这是真实的生活吗?这只是幻想吗?陷入山崩吗?无法逃避现实吗?”match(/.+?\ \/ig);
//使用join打印结果
document.body.innerHTML+=match.join(“
”);
document.body.innerHTML+=“
”;
//使用for loop and strip打印结果|
对于(变量i=0;i ”;
}
var matches=someString.match(REGEX\u模式);
对于(变量i=0;匹配项&&i
当我需要.exec
时,我总是做以下事情:
var re = /.../g, match;
while (match = re.exec(...)) {
//...
}
带有g
标志的正则表达式在循环条件下会产生无限效果
如果要避免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循环
更简单,避免了像do
中的if
语句这样不必要的代码。如果您了解代码的行为和上下文,条件中的赋值就不会像人们想象的那么糟糕
另一种情况是,当您使用linter以避免将比较运算符(例如==)误键入为赋值运算符时,但现在使用的大多数linter都支持使用注释来修改代码特定部分中的linter行为,因此这并不是一个真正的问题为什么不使用匹配
。它将返回一个可以循环的数组。你现在设计它的方式将是一个无止境的循环。你在这个循环中试图做什么?“在进行时避免内部分配”-为什么?您可以避免它,但它确实没有那么糟糕。无论它是否具有g
标志,它都无法正常工作。在这种情况下,应该将其分配给外部循环。@dfsq对此不确定。我能想到的唯一原因是赋值“=”很容易被比较“=”误读。tbh和ESLint对此表示不满(无条件分配)。如果REGEX_模式需要捕获组并且设置了全局标志,则需要使用RegExp.exec()
@w35l3y未意识到这一点。直到。这个问题没有说明他需要做什么…@w35l3y。我在问题中加入了正则表达式。抱歉,我在最初发布时错过了它。是的…我在循环之外有正则表达式声明。维特根斯坦,我的答案还是一样的。我认为没有更好、更短的方法来做你想做的事情,而不丢失易读性。太好了!如果(!match)break,您也可以在不匹配时中断代码>
someString.replace(REGEX_PATTERN,
function (wholeMatch, group1, group2/*...*/, index, sourceString) {
// Do stuff here per match…
});
var URLRegExp = /url\s*\(\s*["|']?(.*?)\s*["|']?\)\s*/g
var match
do {
match = URLRegExp.exec(bootstrap)
if (match) {
// Do stuff here per match...
}
} while (match)