首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regexp字符串替换

Regexp字符串替换
EN

Stack Overflow用户
提问于 2020-03-04 23:36:06
回答 3查看 29关注 0票数 0

这个简单的代码应该替换一个基于regExp的子字符串,但奇怪的是,它似乎跳过了所有其他匹配。我很难弄清楚到底是什么问题。while第三方法典的一部分,我宁愿不改变它。

代码语言:javascript
复制
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跳过每一场比赛似乎只是删除了解决的全局标志。

EN

回答 3

Stack Overflow用户

发布于 2020-03-04 23:46:51

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

对象/RegExp/exec

票数 3
EN

Stack Overflow用户

发布于 2020-03-04 23:46:59

如果您想要更改while循环,这可能会有所帮助。我会给出一个答案。使用replace

代码语言:javascript
复制
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 replacement = function(match, type, path) {
  return `REPLACED: ${type} - ${path}`;
}

console.log(text.replace(regex, replacement));

票数 0
EN

Stack Overflow用户

发布于 2020-03-04 23:50:36

代码语言:javascript
复制
//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 = /<!-- build:([\s\S]*?)\[([\s\S]*?)] -->[\s\S]*?<!-- \/build -->/gm.exec(text)) != null) {
          var replacement = replacementFn.apply(null, matches)
          text = text.replace(matches[0], replacement)
}
// end 3rd party code
console.log(text)

必须为每个while循环创建一个新的Regex实例。

代码语言:javascript
复制
var regex = function(){
 return /<!-- 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60536244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档