javascript - 正则表达式字符串替换

标签 javascript regex

这个简单的代码应该替换基于正则表达式的子字符串,但奇怪的是它似乎跳过了所有其他匹配。我正在努力找出问题所在。 while3rd party code 的一部分,我宁愿不改变它。

var text = `
<!-- build:js[vendor0.js] -->
xx
<!-- /build -->
<!-- build:js[vendor1.js] -->
xx
<!-- /build -->
<!-- build:js[vendor2.js] -->
xx
<!-- /build -->
<!-- build:js[vendor3.js] -->
xx
<!-- /build -->
<!-- build:js[vendor4.js] -->
xx
<!-- /build -->
`
var regex = /<!-- build:([\s\S]*?)\[([\s\S]*?)] -->[\s\S]*?<!-- \/build -->/gm
var replacementFn = function(match, type, path) { return `REPLACED: ${type} - ${path}` }

// 3rd party code
while ((matches = regex.exec(text)) != null) {
          var replacement = replacementFn.apply(null, matches)
          text = text.replace(matches[0], replacement)
}
// end 3rd party code
console.log(text)

解决方案: 从这里 JS regex skips every other match 似乎只是删除全局标志就解决了。

最佳答案

RegExp 是有状态的,这意味着对 exec 的调用“记住”匹配的最后位置,并在下一次调用时从那里开始。您可能更愿意使用 String.prototype.match 来避免调用 RegExp.exec 的有状态行为。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

关于javascript - 正则表达式字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60536244/

相关文章:

javascript - 带有搜索输入的 jQuery Json 过滤器,无需使用任何过滤器插件

javascript - 将 XML 解析为 Javascript 对象

regex - 如何搜索和匹配模式以获取 ansible 中的值

java - 重复模式的模式匹配

regex - 删除所有超过两个字符的单词

regex - 捕获组引用 + 数字

javascript - 通过 AJAX/AngularJS 发送调整大小的图像

javascript - Laravel 中通过 Ajax 上传文件

javascript - 加载已经旋转的 css 元素

javascript - 正则表达式替换不替换(谷歌应用程序脚本)