这个简单的代码应该替换基于正则表达式的子字符串,但奇怪的是它似乎跳过了所有其他匹配。我正在努力找出问题所在。 while
是 3rd 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/