所以我知道,例如,"This is a test".split("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)
替换了所有出现的地方str2
与 str3
最佳答案
不,它们不等价。这是一个边缘案例……
按空字符串拆分返回原始字符串中每个字符的数组:
"foo".split('') --> ["f", "o", "o"]
你可能会认为一个空的正则表达式(RegExp('', 'g')
或 /(?:)/
)会一样工作,尤其是如果您使用 split 对其进行测试:
"foo".split(/(?:)/g) --> ["f", "o", "o"]
但是,在替换方法中,它的工作方式有点不同。因为它匹配字符串中的每个零宽度位置,包括第一个字符之前和最后一个字符之后的零宽度位置:
"foo".replace(/(?:)/g, '-') --> "-f-o-o-"
发生这种情况是因为 split 方法在某种意义上“开始”于第一个字符并“停止”于最后一个字符,而 replace 方法允许“开始”于第一个字符之前并且“在最后一个 之后停止。因此,任何匹配字符串开头或结尾的正则表达式都会有不同的行为。
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>
关于javascript - str.split(someString).join(someOtherString) 是否等同于替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37282015/