所以我知道,例如,"This is a test".split("i").join("j")
可以用"i"
替换"j"
的每个实例。我很好奇是否分裂和连接的过程与使用正则表达式替换完全等效,或者是否存在给定字符串str1
,{{1}的任何极端情况}和str2
我们有
str3
编辑:为了澄清,str1.split(str2).join(str3) != str1.replace(/str2/g,str3)
我的意思是假设的str1.replace(/str2/g,str3)
用str1.replaceAll(str2,str3)
取代所有str2
答案 0 :(得分:2)
不,他们不等同。这是一个边缘案例......
按空字符串拆分会返回原始字符串中每个字符的数组:
"foo".split('') --> ["f", "o", "o"]
您可能认为空的正则表达式(RegExp('', 'g')
或/(?:)/
)的工作方式相同,特别是如果您使用split进行测试:
"foo".split(/(?:)/g) --> ["f", "o", "o"]
但是,在替换方法中,它的工作方式略有不同。因为它匹配字符串中的每个零宽度位置,包括第一个字符之前的零宽度位置和最后一个字符之后的:
"foo".replace(/(?:)/g, '-') --> "-f-o-o-"
这是因为某种意义上的拆分方法在第一个字符处“开始”而在最后一个字符处“停止”,而替换方法允许在第一个字符之前“启动”并且之后停止'。因此,匹配字符串开头或结尾的任何正则表达式的行为都不同。
var testCases = [/(?:)/g, /^/g, /$/g, /\b/g, /\w*/g];
$.each(testCases, function(i, r) {
$("#t").append(
$("<tr>").append(
$("<td>").text(r.toString()),
$("<td>").text("foo bar".split(r).join('-')),
$("<td>").text("foo bar".replace(r, '-'))
)
);
});
* { font-family:monospace; }
table { border-collapse: collapse }
td,th { border:1px solid #999; padding: 3px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="t">
<tr>
<th>RegExp</th>
<th>str.split(r).join('-')</th>
<th>str.replace(r, '-')</th>
</tr>
</table>
答案 1 :(得分:0)
<强>答案:强>
replace()
允许您将匹配的文本替换为其他字符串。
split()
方法只是从输入字符串和分隔符字符串
join()
方法返回一个字符串,其中包含使用传递给join()
您可以使用split()
和join()
来模拟replace()
方法,但这会使您的代码不太清楚,无法理解。
示例:强>
var a = 'Dont use join and split when replace is preferable';
a.split(' ').join('') === a.replace(/\s+/g, ''); // will return true :)
答案 2 :(得分:0)
您不必走得很远就能看到split().join()
与replace()
不同的地方。考虑你想要替换所有出现的人称代词&#34; me&#34;在&#34;我自己&#34;的字符串中。 split().join()
将替换所有出现的字母序列&#34; me&#34;不考虑用法,所以字符串&#34;我需要一些时间给我&#34;将成为&#34;我需要我自己 ti 我自己 我自己&#34;。
然而,使用适当的正则表达式,您只能捕获并替换单词&#34; me&#34;,因此您的结果将是&#34;我需要一些时间给自己&#34;。
答案 3 :(得分:0)
TL; DR:否。
您的代码相当于假设的string.replaceAll(str,repl)
,但不属于string.replace(str,repl)
问题是string.replace("str","bystr")
仅替换第一次出现的“str”。但是您的代码会替换所有出现的内容。