用一个字符串替换字符串中的多个字符会重写这些字符。

3

我有一个变量(在这个例子中是var str = "I!%1$s-I!%2$s TTL!%3$s";),我想用数组中的元素(var regex = ['aaa', 'bbb', 'ccc'];)替换其中的%

我在网上搜索了一下,并找到了这个解决方案,但我在实现时遇到了问题。我的问题是,我想用多个字符来替换单个字符,然后继续字符串,但这只会覆盖掉那些字符。我实际上不知道为什么。

非常感谢您的帮助,以下是我的代码:

String.prototype.replaceAt = function(index, character) {
  return this.substr(0, index) + character + this.substr(index + character.length);
}

var str = "I!%1$s-I!%2$s TTL!%3$s";
var regex = ['replace', 'replace', 'replace'];

//find position of %
var find = /%/gi,
  result, pos = [];
while ((result = find.exec(str))) {
  pos.push(result.index);
}

//replace % with regex elements
for (x = 0; x < pos.length; x++) {
  str = str.replaceAt(pos[x], regex[x]);
}

document.write(str);


1
也许这是一个愚蠢的问题,但为什么不能使用字符串的替换方法呢? - Shilly
因为您没有更新 pos。如果我们有一个字符串 "abc",这里的 "c" 是第三个字符。如果我们用 "foo" 替换 "b" ("afooc"),那么 "c" 现在是第五个字符。 - James Donnelly
如果我理解正确的话,您需要将字符串中的%字符替换为正则表达式数组中相应的值,其中值的索引对应于字符串中%字符的出现次数? - Develoger
因为数组元素并不总是相同的(.replace会将所有的%替换为一个字符串)。我猜我举了个不好的例子,我会去编辑它。 - Miha Šušteršič
@DušanRadojević 是的,没错 - Miha Šušteršič
在这种情况下,您甚至可以在循环中使用string.replace,因为它始终会替换第一次出现的%字符... 但我投票支持@thefourtheye的答案。 - Develoger
1个回答

3
使用替换函数,如下所示:
var str = "I!%1$s-I!%2$s TTL!%3$s";
var regex = ['[123]', '[456]', '[789]'];

console.log(str.replace(/%(\d+)/g, function(match, group1) {
  return regex[parseInt(group1) - 1] + group1;
}));
// I![123]1$s-I![456]2$s TTL![789]3$s

正则表达式 /%(\d+)/g 匹配任何符合模式 % 接着一个或多个数字的字符串,并将数字作为一个组进行捕获。然后将完全匹配和该组传递到函数以获取实际替换值。在函数中,您可以使用 parseInt 将组转换为数字,然后从 regex 数组中返回相应的值。


这段程序没有考虑空格,并且在第三次替换时漏掉了一个字符(3被覆盖)。 - Miha Šušteršič
@MihaŠušteršič,我展示的输入应该输出什么? - thefourtheye
抱歉,这实际上是所有三个数字的问题(一个字符仍然被覆盖)。 - Miha Šušteršič
@MihaŠušteršič 然后在替换中也附上组。请查看更新的答案。 - thefourtheye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接