为什么javascript在使用replace时只替换第一个实例?
我有这个为什么javascript在使用replace时只替换第一个实例?,javascript,jquery,Javascript,Jquery,我有这个 var date = $('#Date').val(); 这将在文本框中获取如下所示的值 12/31/2009 现在我在上面做这个 var id = 'c_' + date.replace("/", ''); 结果是 c_1231/2009 它遗漏了最后一个“/”,但我不明白为什么。您需要将设置为全局替换: date.replace(new RegExp("/", "g"), '') // or date.replace(/\//g, '') 否则,将只替换第一次出现的字符串。
var date = $('#Date').val();
这将在文本框中获取如下所示的值
12/31/2009
现在我在上面做这个
var id = 'c_' + date.replace("/", '');
结果是
c_1231/2009
它遗漏了最后一个“/”,但我不明白为什么。您需要将设置为全局替换:
date.replace(new RegExp("/", "g"), '')
// or
date.replace(/\//g, '')
否则,将只替换第一次出现的字符串。与C#/.NET类库(以及大多数其他合理的语言)不同,当您将字符串作为字符串传入,以匹配字符串的参数。replace
方法时,它不会执行字符串替换。它将字符串转换为RegExp
,并进行正则表达式替换。正如Gumbo所解释的,正则表达式替换需要g
lobal标志,默认情况下不启用,用于一次性替换所有匹配项
如果您想要一个真正的基于字符串的替换 — 例如,因为匹配字符串是动态的,并且可能包含在正则表达式中具有特殊含义的字符 — 这方面的JavaScript习惯用法是:
var id= 'c_'+date.split('/').join('');
您可以使用:
String.prototype.replaceAll = function(search, replace) {
if (replace === undefined) {
return this.toString();
}
return this.split(search).join(replace);
}
那么为什么要用C#替换呢。我认为它将默认替换所有事件。但是,如果它只是第一次出现,为什么要去掉两个斜杠呢?@chobo2它没有去掉两个斜杠。一开始只有两个,但它删除了第一个。@chobo2:好吧,JavaScript不是C#。2009年12月31日12/31
只包含两个斜杠。如果您想真正推动这类功能,您可以尝试类似String.prototype.strReplace=function(needle,replacement){返回此.split(needle).join(replacement | | | |)}
那么你就可以var id=“c_”+date.strReplace(“/”)
对于类似问题,我更喜欢这里的解释。接受的答案只提供了一个解决方法,而不是标题中的“为什么”。这似乎只适用于我的搜索字符串的前两个实例。。。所有其他的都被忽略了。。。??(我的搜索实例有多个字符是否重要?@bobince,情况似乎不是这样:“它将字符串转换为RegExp并进行regex替换。”请看这些:“abc.replace”(“^a”),“”)
»“abc”
和“abc.replace(new RegExp”(“^a”),“”)
”“abc.replace”(new RegExp RegExp(“^a”),“”)
@tomekwi将字符串转换为正则表达式的一部分将涉及转义特殊字符。这是如此痛苦和不必要。我想知道是什么原因实现这样的replace
。我甚至选择了str.split(search).join(replacement)
在regexp.Update上:有人建议将String.prototype.replaceAll
添加到标准中: