所以我有以下内容:
var token = '[token]';
var tokenValue = 'elephant';
var string = 'i have a beautiful [token] and i sold my [token]';
string = string.replace(token, tokenValue);
上述内容只会替换第一个[token]
而单独留下第二个。
如果我使用正则表达式,我可以像
一样使用它string = string.replace(/[token]/g, tokenValue);
这将替换我的所有[tokens]
但是,如果不使用//
答案 0 :(得分:14)
对于我的大多数情况,我发现分裂/加入足够令人满意。 一个真实的例子:
myText.split("\n").join('<br>');
答案 1 :(得分:9)
为什么不在每次出现do while循环时都替换令牌?
var index = 0;
do {
string = string.replace(token, tokenValue);
} while((index = string.indexOf(token, index + 1)) > -1);
答案 2 :(得分:3)
string = string.replace(new RegExp("\\[token\\]","g"), tokenValue);
答案 3 :(得分:1)
"[.token.*] nonsense and [.token.*] more nonsense".replace("[.token.*]", "some", "g");
将产生:
&#34;一些废话和一些废话&#34;
答案 4 :(得分:1)
我意识到@TheBestGuest的答案对于下面的例子不起作用,因为你将以无限循环结束:
var stringSample= 'CIC';
var index = 0;
do { stringSample = stringSample.replace('C', 'CC'); }
while((index = stringSample.indexOf('C', index + 1)) > -1);
所以这是我用TypeScript编写的replaceAll方法的命题:
let matchString = 'CIC';
let searchValueString= 'C';
let replacementString ='CC';
matchString = matchString.split(searchValueString).join(replacementString);
console.log(matchString);
答案 5 :(得分:0)
你可以使用indexOf第一次出现:
var index=str.indexOf(token);
然后有一个这样的函数来替换它
String.prototype.replaceAt=function(index, tokenvalue) {
return this.substr(0, index) + character + this.substr(index+character.length);
}
答案 6 :(得分:0)
注意到接受的答案,replaceWith字符串可以包含inToReplace字符串,在这种情况下会有一个无限循环......
这是一个更好的版本:
function replaceSubstring(inSource, inToReplace, inReplaceWith)
{
var outString = [];
var repLen = inToReplace.length;
while (true)
{
var idx = inSource.indexOf(inToReplace);
if (idx == -1)
{
outString.push(inSource);
break;
}
outString.push(inSource.substring(0, idx))
outString.push(inReplaceWith);
inSource = inSource.substring(idx + repLen);
}
return outString.join("");
}
答案 7 :(得分:0)
不幸的是,由于Javascript的字符串replace()
函数不允许您从特定的索引开始,并且无法对字符串进行就地修改,因此实际上很难高效地做到这一点。精明的语言。
.split().join()
并不是一个好的解决方案,因为它涉及到创建字符串负载(尽管我怀疑V8做了一些黑魔法来优化此效果)。replace()
是一个糟糕的解决方案,因为replace每次都从字符串的开头开始搜索。这将导致O(N ^ 2)行为!如此处的答案所述,它也存在无限循环的问题。一种合理的方法是使用适当的替换来构建新字符串:
function replaceAll(input: string, from: string, to: string): string {
const fromLen = from.length;
let output = "";
let pos = 0;
for (;;) {
let matchPos = input.indexOf(from, pos);
if (matchPos === -1) {
output += input.slice(pos);
break;
}
output += input.slice(pos, matchPos);
output += to;
pos = matchPos + fromLen;
}
return output;
}
I benchmarked this与所有其他解决方案(除了在可怕的循环中调用replace()
相比),它的输出比正则表达式快一点,大约是{{1 }} / split
。
编辑:这几乎是与Stefan Steiger的答案相同的方法,出于某种原因,我完全没有想到。但是由于某种原因,他的答案仍然使用join
,这使其比我的慢4倍。