是str.split(someString).join(someOtherString)等效于替换吗?

时间:2016-05-17 16:43:36

标签: javascript regex string algorithm

所以我知道,例如,"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

4 个答案:

答案 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”。但是您的代码会替换所有出现的内容。