使用正则表达式

时间:2015-12-25 01:51:50

标签: javascript regex string

我遇到的情况是,我希望在每次出现;或换行时拆分字符串。我想确保这不会留下任何空数组元素,所以我决定使用正则表达式尽可能长地包含一个字符串。

我首先尝试使用foo.split(/(\n|\r|;)+/),但这种奇怪的做法并没有按照预期的方式进行双重输入。使用(据我所知)相同的语法foo.split(/[\n\r;]+/)确实按预期工作。

以下是一个例子:

var foo = "test;\nexample;\n\ndouble enters;\nand without semicolon\nend;\n";
console.log(foo.split(/[\n\r;]+/));
console.log(foo.split(/(\n|\r|;)+/));
//and to show that the matching strings are indeed equal:
console.log(foo.match(/[\n\r;]+/g));
console.log(foo.match(/(\n|\r|;)+/g));

document.write('<pre>'+foo+'</pre>'); //demonstrating what the string looks like.

因为您可以在控制台中看到如果您运行该代码段,正则表达式应该在这里相同,因为它们match()完全相同的字符。分割字符串时的输出完全不同。

例如,用A和B替换匹配的字符时出现同样的错误(用A替换所有换行符,用B分号替换分号)。即便如此,这两个正则表达式的分裂也有不同的结果。

所以我的问题是:有谁知道导致这种神秘行为的原因是什么?

1 个答案:

答案 0 :(得分:2)

这是因为当您使用具有.split()方法的捕获组时,捕获组的匹配内容将包含在结果数组中。

来自MDN

  

如果分隔符包含捕获括号,则在数组中返回匹配的结果。

如果您使用非捕获组,结果将是相同的:

foo.split(/(?:\n|\r|;)+/)

示例:

&#13;
&#13;
var foo = "test;\nexample;\n\ndouble enters;\nand without semicolon\nend;\n";
console.log(foo.split(/[\n\r;]+/));
console.log(foo.split(/(?:\n|\r|;)+/));
//and to show that the matching strings are indeed equal:
console.log(foo.match(/[\n\r;]+/g));
console.log(foo.match(/(\n|\r|;)+/g));
&#13;
&#13;
&#13;