如何替换除JavaScript中第一个字符串之外的所有字符串?

时间:2018-04-24 23:31:55

标签: javascript node.js regex string

我有这个字符串:

hello world hello world hello world hello

我需要得到以下内容:

hello world hello hello hello

如果我使用:

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

它只删除上面字符串中第一次出现的world

如何替换除第一个之外的所有匹配项?

5 个答案:

答案 0 :(得分:12)

您可以将函数传递给String#replace,您可以在其中指定省略替换第一个匹配项。还要将替换的第一个参数设置为匹配所有匹配项。

<强>演示

let str = 'hello world hello world hello world hello',
    i = 0;
    
str = str.replace(/world/g, m  => !i++ ? m : '');
console.log(str);

注意

您可以使用IIFE

来避免使用全局计数器变量i

let str = 'hello world hello world hello world hello';

str = str.replace(/world/g, (i => m => !i++ ? m : '')(0));
console.log(str);

答案 1 :(得分:2)

为了提供@Kristianmitk优秀答案的替代方案,我们可以使用正面的后视,Node.Js&amp; Chrome&gt; = 62

&#13;
&#13;
const string = 'hello world hello world hello world hello';

console.log(
  string.replace(/(?<=world[\s\S]+)world/g, '')
);
// or
console.log(
  string.replace(/(?<=(world)[\s\S]+)\1/g, '')
);
&#13;
&#13;
&#13;

使用Symbol.replace众所周知的符号。

  

Symbol.replace众所周知的符号指定了该方法   替换字符串的匹配子串。这个函数被调用   String.prototype.replace()方法。

&#13;
&#13;
const string = 'hello world hello world hello world hello';

class ReplaceButFirst {
     constructor(word, replace = '') {
         this.count = 0;
         this.replace = replace;
         this.pattern = new RegExp(word, 'g');
     }
     
     [Symbol.replace](str) {
          return str.replace(this.pattern, m => !this.count++ ? m : this.replace);
     }
}

console.log(
  string.replace(new ReplaceButFirst('world'))
);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

在我的解决方案中,我用当前时间戳替换第一个匹配项,然后替换所有匹配项,最后用world替换时间戳

您也可以使用str.split('world')然后加入

var str = 'hello world hello world hello world hello';
var strs = str.split('world');
str = strs[0] + 'world' + strs.slice(1).join('');
console.log(str);

&#13;
&#13;
var str = 'hello world hello world hello world hello';

const d = Date.now()
str = str.replace('world', d).replace(/world/gi, '').replace(d, 'world');

console.log(str);
&#13;
&#13;
&#13;

答案 3 :(得分:1)

var str = 'hello world hello world hello world hello'; 

var count = 0;
var result = str.replace(/world/gi, function (x) {
  if(count == 0) {
      count++;
      return x;
    } else {
      return '';	
    }
});

console.log(result);

答案 4 :(得分:0)

我会这样做:

  1. 获取子字符串,直到并包括第一次出现。
  2. 在第一次出现后附加子字符串,删除所有其他出现的内容:
  3.     function replaceExceptFirst(str, search) {
             let index = str.indexOf(search);
             return str.substring(0, index + search.length) + 
                 str.substring(index + search.length).replace(/world/g, '')
        }
        
        console.log(replaceExceptFirst('hello world hello world world hello', 'world'))