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

标签 javascript regex string algorithm

所以我知道,例如,"This is a test".split("i").join("j") 具有替换 的每个实例的效果i""j"。我很好奇拆分和连接的过程是否完全等同于使用正则表达式替换,或者对于给定的字符串 str1, 是否存在任何极端情况str2str3 我们有

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

编辑:为了澄清,str1.replace(/str2/g,str3) 我的意思是一个假设的 str1.replaceAll(str2,str3) 替换了所有出现的地方str2str3

最佳答案

不,它们不等价。这是一个边缘案例……

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

"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/

相关文章:

javascript - 如何收集 AngularJS 中已选择的行的数据?

javascript - 如何编写正则表达式从 URL 获取参数

c# - 如何删除字符串开头的空格?

c++ - 如何将 vector 转换为特定类型的字符串

正则表达式 - 匹配所有内容,没有空格

c++ - 检查字符串是否包含非字母数字字符

javascript - Angular ngFor不显示更改的数组

javascript - 将隐藏字段传递给 JavaScript 函数

javascript - 为什么我无法通过 jQuery 更改 href 值?

Javascript 多电子邮件正则表达式验证