为什么javascript在使用replace时只替换第一个实例?

cho*_*bo2 136 javascript jquery

我有这个

 var date = $('#Date').val();
Run Code Online (Sandbox Code Playgroud)

这得到文本框中的值,看起来像这样

2009/12/31

现在我就这样做了

var id = 'c_' + date.replace("/", '');
Run Code Online (Sandbox Code Playgroud)

结果是

c_1231/2009

它错过了最后的'/'我不明白为什么.

Gum*_*mbo 239

您需要将g标志设置为全局替换:

date.replace(new RegExp("/", "g"), '')
// or
date.replace(/\//g, '')
Run Code Online (Sandbox Code Playgroud)

否则只会替换第一次出现.

  • @ chobo2:嗯,JavaScript不是C#.并且`12/31/2009`只包含两个斜杠. (5认同)
  • @ chobo2它没有带走两个斜线.开始时只有两个,它删除了第一个. (2认同)

bob*_*nce 73

与C#/ .NET类库(以及大多数其他敏感语言)不同,当您将Stringin作为string-to-match参数传递给string.replace方法时,它不会执行字符串替换.它将字符串转换为a RegExp并进行正则表达式替换.正如Gumbo所解释的那样,正则表达式替换需要一个g默认情况下未启用的lobal标志来一次性替换所有匹配.

如果你想要一个真正的基于字符串的替换 - 例如因为匹配字符串是动态的并且可能包含在regexen中具有特殊含义的字符 - 那么JavaScript的习语就是:

var id= 'c_'+date.split('/').join('');
Run Code Online (Sandbox Code Playgroud)

  • 如果你想真正推动这种功能,你可能会尝试类似`String.prototype.strReplace = function(needle,replacement){return this.split(needle).join(replacement ||"");};`然后你可以`var id ="c _"+ date.strReplace("/")` (2认同)
  • @tomekwi将字符串转换为正则表达式的一部分将涉及转义特殊字符. (2认同)

Hig*_*g15 9

您可以使用:

String.prototype.replaceAll = function(search, replace) {
if (replace === undefined) {
    return this.toString();
}
return this.split(search).join(replace);
}
Run Code Online (Sandbox Code Playgroud)