使用javascript拆分时忽略正则表达式捕获组

时间:2016-03-03 05:26:24

标签: javascript regex

我正在尝试将字符串拆分为数组,并且我希望使用以下格式恢复数组:['a','b', 'c']

const code = "/*_ ex1.js */a/*_ ex2.js */b/*_ ex3.js */c"
code.split(/\/\*_.+?\*\//)

=> (这就是我想要的)

['a','b', 'c']

但是当我尝试确保正则表达式适用于新行

code.split(/\/\*_(.|\s)+?\*\//)

=>(不是我想要的)

[' ', 'a', ' ', 'b', ' ', 'c']

我不知道这些额外的空间来自哪里。它显然与括号中的捕获组有关,但我不明白如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

split包含输出中任何捕获组的内容。来自MDN

  

如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。

在您的情况下,(.|\s)是一个捕获组。因此,空格将包含在您的输出中。解决此问题的最简单方法是使其成为具有?:的非捕获组:

code.split(/\/\*_(?:.|\s)+?\*\//)
                  ^^

这仍然会在结果数组中留下一个初始的空字符串。 (你的初始非多行版本也表现得那样。)没有办法解决这个问题,因为你的分割器正好在字符串的开头,因此左边的标记是一个空字符串。如果你想摆脱它,你可以过滤掉它:

.filter(Boolean)

答案 1 :(得分:0)

尝试使用String.prototype.match()RegExp /[a-z](?=\/|\n|$)/g匹配字符类az后跟/字符或换行符或结尾输入



const code = "/*_ ex1.js */a/*_ ex2.js */b/*_ ex3.js */c\n"
             + "/*_ ex4.js */d/*_ ex5.js */e/*_ ex6.js */f";
var res = code.match(/[a-z](?=\/|\n|$)/g);
console.log(res);