我遇到的情况是,我希望在每次出现;
或换行时拆分字符串。我想确保这不会留下任何空数组元素,所以我决定使用正则表达式尽可能长地包含一个字符串。
我首先尝试使用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分号替换分号)。即便如此,这两个正则表达式的分裂也有不同的结果。
所以我的问题是:有谁知道导致这种神秘行为的原因是什么?
答案 0 :(得分:2)
这是因为当您使用具有.split()
方法的捕获组时,捕获组的匹配内容将包含在结果数组中。
来自MDN:
如果分隔符包含捕获括号,则在数组中返回匹配的结果。
如果您使用非捕获组,结果将是相同的:
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));
&#13;