繁体   English   中英

在while循环中对regex.exec()分配的更好解决方案

[英]Better solution to regex.exec() assignment in while loop

这里有更好的解决方案吗? 我尽力避免在内部while分配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示例。

如果要避免在while里面while分配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避免将比较运算符(例如==)键入为赋值运算符时,但是所有使用的lint现在都支持使用注释来修改代码特定部分中的lint行为,因此这真的不是问题

当我需要.exec时,我总是按照以下.exec

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

g标志的正则表达式在循环条件下会产生无限影响。

Fx 3.x和Fx 4.x之间的区别是什么导致许多用户脚本停止工作?

 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

var matches = someString.match(REGEX_PATTERN);
for (var i = 0; matches && i < matches.length; i++) {
  // Do stuff here per match…
}
someString.replace(REGEX_PATTERN,
    function (wholeMatch, group1, group2/*...*/, index, sourceString) {
        // Do stuff here per match…
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM