Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么javascript在使用replace时只替换第一个实例?_Javascript_Jquery - Fatal编程技术网

为什么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
添加到标准中: