没有正则表达式替换所有我可以使用G

时间:2013-05-29 01:09:14

标签: javascript regex replace

所以我有以下内容:

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]

但是,如果不使用//

,我不知道如何做到这一点

8 个答案:

答案 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)行为!如此处的答案所述,它也存在无限循环的问题。
  • 如果您的替换字符串是一个编译时间常数,则正则表达式可能是最好的解决方案,但是如果不是,那么您就不能真正使用它。您应该绝对 not 尝试通过转义内容将任意字符串转换为正则表达式。

一种合理的方法是使用适当的替换来构建新字符串:

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倍。