Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript while循环中regex.exec()赋值的更好解决方案_Javascript_Regex - Fatal编程技术网

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)