replace多个 如何在JavaScript中替换所有出现的字符串?




replace函数 (24)

我有这个字符串:

"Test abc test test abc test test test abc test test abc"

str = str.replace('abc', '');

似乎只删除了上面字符串中第一次出现的abc 。 如何更换所有出现的内容?


只需添加/g

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

// Replace 'hello' string with /hello/g regular expression.
document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

/g表示全局


替换单引号:

function JavaScriptEncode(text){
    text = text.replace(/'/g,''')
    // More encode here if required

    return text;
}

JavaScript中使用RegExp可以为您完成工作,只需执行以下操作:

var str = "ff ff f f a de def";
str = str.replace(/f/g,'');
alert(str);

如果您考虑重用,请创建一个函数来为您执行此操作,但不推荐它,因为它只是一个行函数,但如果您大量使用它,您可以编写如下内容:

while (str.indexOf('abc') !== -1)
{
    str = str.replace('abc', '');
}

并简单地在代码中反复使用它,如下所示:

var str ="Test abc test test abc test test test abc test test abc";
str = str.replace(/abc/g, '');

但正如我前面提到的,它不会在要写入的行或性能方面产生巨大的差异,只有缓存函数可能会对长字符串产生更快的性能,如果你想重用,也可以很好地实现DRY代码。


使用正则表达式:

str.replace(/abc/g, '');

只需遵循这个oneliner正则表达式添加区分大小写,所以如果你做“ABC”,它将与“abc”的行为相同。

str = str.replace(/abc/gi, "");

str = str.replace(/abc/g, '');

回应评论:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

为了回应的评论,您可以进一步简化它:

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(find, 'g'), replace);
}

注意:正则表达式包含特殊(元)字符,因此在上面的find函数中盲目传递参数而不预先处理它以逃避这些字符是危险的。 Mozilla开发者网络正则表达式JavaScript指南中介绍了这一点,它们提供了以下实用程序功能:

function escapeRegExp(str) {
    return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

因此,为了使上面的replaceAll()函数更安全,如果还包含escapeRegExp ,可以将其修改为以下escapeRegExp

function replaceAll(str, find, replace) {
    return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}

str = str.replace(new RegExp("abc", 'g'), "");

比上面的答案更适合我。 所以new RegExp("abc", 'g')创建了一个RegExp,它匹配文本的所有出现( 'g'标志)( "abc" )。 第二部分是替换为,在您的情况下空字符串( "" )。 str是字符串,我们必须覆盖它,因为replace(...)只返回结果,但不是覆盖。 在某些情况下,您可能想要使用它。


如果您尝试确保即使在替换后您要查找的字符串也不存在,则需要使用循环。

例如:

var str = 'test aabcbc';
str = str.replace(/abc/g, '');

完成后,你仍然会'测试abc'!

解决这个问题的最简单的循环是:

var str = 'test aabcbc';
while (str != str.replace(/abc/g, '')){
   str.replace(/abc/g, '');
}

但是每次循环都会进行两次替换。 也许(有被投票的风险)可以合并为一个稍微更有效但不太可读的形式:

var str = 'test aabcbc';
while (str != (str = str.replace(/abc/g, ''))){}
// alert(str); alerts 'test '!

在查找重复字符串时,这可能特别有用。
例如,如果我们有'a ,,, b',我们希望删除所有重复的逗号。
[在这种情况下,可以做.replace(/,+ / g,','),但在某些时候,正则表达式变得复杂而且足够缓慢而不是循环。


function replaceAll(str, find, replace) {
  var i = str.indexOf(find);
  if (i > -1){
    str = str.replace(find, replace); 
    i = i + replace.length;
    var st2 = str.substring(i);
    if(st2.indexOf(find) > -1){
      str = str.substring(0,i) + replaceAll(st2, find, replace);
    }       
  }
  return str;
}

你可以尝试结合这两种强大的方法。

"test abc test test abc".split("abc").join("")

希望能帮助到你!


//循环直到数字出现为0.或者只是复制/粘贴

    function replaceAll(find, replace, str) 
    {
      while( str.indexOf(find) > -1)
      {
        str = str.replace(find, replace);
      }
      return str;
    }

var string  = 'Test abc Test abc Test abc Test abc'
string = string.replace(/abc/g, '')
console.log(string)

虽然人们已经提到了正则表达式的使用,但是如果你想要替换文本而不管文本的情况如何,那么有更好的方法。 像大写或小写。 使用以下语法

//Consider below example
originalString.replace(/stringToBeReplaced/gi, '');

//Output will be all the occurrences removed irrespective of casing.

您可以在here参考详细示例。


这是不使用正则表达式最快版本。

修改了jsperf

replaceAll = function(string, omit, place, prevstring) {
  if (prevstring && string === prevstring)
    return string;
  prevstring = string.replace(omit, place);
  return replaceAll(prevstring, omit, place, string)
}

它几乎是分割和连接方法的两倍

正如在这里的评论中所指出的,如果你的omit变量包含place ,这将不起作用,如: replaceAll("string", "s", "ss") ,因为它总是能够替换该单词的另一个出现。

在我的递归替换上还有另一个带有变体的jsperf甚至更快( http://jsperf.com/replace-all-vs-split-join/12 )!

  • 2017年7月27日更新:看起来RegExp现在拥有最近发布的Chrome 59中最快的性能。

匹配全局正则表达式:

anotherString = someString.replace(/cat/g, 'dog');

如果您想要查找的内容已经在字符串中,并且您没有方便的正则表达式,则可以使用join / split:

    function replaceMulti(haystack, needle, replacement)
    {
        return haystack.split(needle).join(replacement);
    }

    someString = 'the cat looks like a cat';
    console.log(replaceMulti(someString, 'cat', 'dog'));


str = str.replace(/abc/g, '');

或者从这里尝试replaceAll函数:

有哪些有用的JavaScript方法可以扩展内置对象?

str = str.replaceAll('abc', ''); OR

var search = 'abc';
str = str.replaceAll(search, '');

编辑:关于replaceAll可用性的澄清

'replaceAll'方法被添加到String的原型中。 这意味着它可用于所有字符串对象/文字。

例如

var output = "test this".replaceAll('this', 'that');  //output is 'test that'.
output = output.replaceAll('that', 'this'); //output is 'test this'

var str ="Test abc test test abc test test test abc test test abc";
str = str.replaceAll('abc', '');

如果字符串包含类似abccc类似模式,则可以使用:

str.replace(/abc(\s|$)/g, "")

使用带有g标志集的正则表达式将替换所有:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

另见


您可以简单地使用以下方法

/**
 * Replace all the occerencess of $find by $replace in $originalString
 * @param  {originalString} input - Raw string.
 * @param  {find} input - Target key word or regex that need to be replaced.
 * @param  {replace} input - Replacement key word
 * @return {String}       Output string
 */
function replaceAll(originalString, find, replace) {
  return originalString.replace(new RegExp(find, 'g'), replace);
};

这是一个基于接受的答案的字符串原型函数:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

编辑

如果您的find将包含特殊字符,那么您需要转义它们:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

小提琴: http://jsfiddle.net/cdbzL/http://jsfiddle.net/cdbzL/


假设您要将所有'abc'替换为'x':

let some_str = 'abc def def lom abc abc def'.split('abc').join('x')
console.log(some_str) //x def def lom x x def

我试图考虑比修改字符串原型更简单的事情。


以下功能对我有用:

String.prototype.replaceAllOccurence = function(str1, str2, ignore) 
{
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
} ;

现在调用这样的函数:

"you could be a Project Manager someday, if you work like this.".replaceAllOccurence ("you", "I");

只需将此代码复制并粘贴到浏览器控制台中即可。





replace