Javascript str.split(someString).join(someOtherString)是否等同于替换?

Javascript str.split(someString).join(someOtherString)是否等同于替换?,javascript,regex,string,algorithm,Javascript,Regex,String,Algorithm,因此我知道,例如,“这是一个测试”。拆分(“I”).join(“j”)的效果是将“I”的每个实例替换为“j”。我很好奇拆分和连接的过程是否与使用正则表达式替换的过程完全等价,或者对于给定的字符串str1、str2和str3,是否有一些特殊情况 str1.split(str2).join(str3) != str1.replace(/str2/g,str3) 编辑:为了澄清起见,我用str1.replace(/str2/g,str3)我指的是一个假设的str1.replaceAll(str2,s

因此我知道,例如,
“这是一个测试”。拆分(“I”).join(“j”)
的效果是将
“I”
的每个实例替换为
“j”
。我很好奇拆分和连接的过程是否与使用正则表达式替换的过程完全等价,或者对于给定的字符串str1、str2和str3,是否有一些特殊情况

str1.split(str2).join(str3) != str1.replace(/str2/g,str3)

编辑:为了澄清起见,我用str1.replace(/str2/g,str3)我指的是一个假设的str1.replaceAll(str2,str3)用str3
str3
替换所有出现的str2
你不必走多远就能看到
split()。考虑这样一种情况,您希望用“我自己”来替换字符串中的人称代词“me”的所有出现。code>split()

但是,使用适当的正则表达式,您可以只捕获并替换单词“me”,因此您的结果将是“我需要一些自己的时间”;医生:没有

您的代码相当于假设的
string.replaceAll(str,repl)
,而不是
string.replace(str,repl)


问题是
string.replace(“str”,“bystr”)
只替换第一次出现的“str”。但是您的代码将替换所有出现的情况。

不,它们不是等效的。这是一个边缘案例

按空字符串拆分返回原始字符串中每个字符的数组:

"foo".split('') --> ["f", "o", "o"]
您可能会认为空正则表达式(
RegExp(“'g')
/(?:)/
)的工作原理是一样的,特别是如果您使用split:

"foo".split(/(?:)/g) --> ["f", "o", "o"]
然而,在replace方法中,它的工作方式有点不同。因为它匹配字符串中的每个零宽度位置,包括第一个字符之前和最后一个字符之后的零宽度位置:

这是因为split方法在某种意义上从第一个字符“开始”到最后一个字符“停止”,而replace方法允许在第一个字符之前“开始”,在最后一个字符之后“停止”。因此,任何与字符串开头或结尾匹配的正则表达式的行为都会有所不同

var testCases=[/(?:)/g,/^/g,/$/g,/\b/g,/\w*/g];
$。每个(测试用例、函数(i、r){
$(“#t”)。追加(
$(“”)。附加(
$(“”).text(r.toString()),
$(“”).text(“foo-bar”.split(r).join('-'),
$(“”).文本(“foo-bar”.replace(r,'-'))
)
);
});
*{font-family:monospace;}
表{边框折叠:折叠}
td,th{border:1px solid#999;padding:3px;}

正则表达式
str.split(r).join('-')
str.replace(r,'-')

我不知道,是吗?似乎检验你的假设比在这里发帖要容易得多。@BrianDriscoll测试角落案例并不琐碎。@ReutSharabani我没说它琐碎,但我也不认为它有那么难。很容易看出split().join()在何处会产生与正则表达式替换不同的/意外的结果。您不能将捕获组与
.split().join()
@FelixKling一起使用。我想OP谈论的是替换非常简单的字符串,即不使用任何正则表达式功能。否则,答案显然是“不”。但是从技术上讲,您可以在
split
中使用捕获组,但结果会大不相同(请尝试
“foo”.split(/(o)/).join('o')
)。这是因为传递给
.split
的值是字符串,而不是正则表达式。因为下面的方法很好:
“我需要一些时间”。拆分(/\bme\b/)。加入(“我自己”)
。我想OP已经意识到了这一点——注意问题是如何有一个
g
标志的。我认为OP的意思是,“假设的
string.replaceAll(str,repl)
是否完全等同于假设的
string.replace(RegExp(RegExp.escape(str),“g”),repl)
?”@p.s.w.g取决于假设的replaceAll方法在另一个假设的ECMA规范中是如何定义的。对我来说,这应该非常接近。@p.s.w.g是的,我的问题是基于一个假设的
replaceAll
"foo".replace(/(?:)/g, '-') --> "-f-o-o-"