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

IT技术 javascript jquery
2021-01-16 02:21:50

我有这个

 var date = $('#Date').val();

这在文本框中获取值看起来像这样

2009 年 12 月 31 日

现在我这样做

var id = 'c_' + date.replace("/", '');

结果是

c_1231/2009

它错过了最后一个 '/' 我不明白为什么。

3个回答

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

date.replace(new RegExp("/", "g"), '')
// or
date.replace(/\//g, '')

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

@chobo2:好吧,JavaScript 不是 C#。并且12/31/2009只包含两个斜线。
2021-03-18 02:21:50
@chobo2 它没有去掉两个斜线。一开始只有两个,它删除了第一个。
2021-03-21 02:21:50
为什么区别然后 C# 替换。认为它会默认替换所有出现的事件。但是,如果它只是第一次出现,为什么要去掉 2 条斜线?
2021-03-31 02:21:50
也许是我见过的关于正则表达式的最翔实的评论!
2021-04-10 02:21:50

与 C#/.NET 类库(以及大多数其他明智的语言)不同,当您将 aString作为字符串匹配参数传入string.replace方法时,它不会执行字符串替换。它将字符串转换为 aRegExp并进行正则表达式替换。正如 Gumbo 解释的那样,正则表达式替换需要g‍lobal 标志(默认情况下未启用)一次​​性替换所有匹配项。

如果你想要一个真正的基于字符串的替换——例如因为匹配字符串是动态的并且可能包含在正则表达式中具有特殊含义的字符——JavaScript 惯用语是:

var id= 'c_'+date.split('/').join('');
@tomekwi 将字符串转换为正则表达式的一部分将涉及转义特殊字符。
2021-03-12 02:21:50
如果你想真正推动这种功能,你可以尝试像String.prototype.strReplace = function(needle, replacement) {return this.split(needle).join(replacement||"");};Then you canvar id = "c_" + date.strReplace("/")
2021-03-15 02:21:50
这似乎只适用于我的搜索字符串的前两个实例......所有其他实例都被忽略......?(我的搜索实例有多个字符是否重要?
2021-03-19 02:21:50
与类似问题的任何其他答案相比,我更喜欢这里的解释。接受的答案仅提供了一种解决方法,而不是标题中“为什么”的答案。
2021-03-25 02:21:50
@bobince,情况似乎并非如此:“它将字符串转换为 RegExp 并进行正则表达式替换。” 看看这些:"abc".replace("^a", "_")»"abc""abc".replace(new RegExp("^a"), "_")»"_bc"
2021-03-28 02:21:50

您可以使用:

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