2016-03-03 86 views
1

我想要的字符串分割成一个阵列时,我期待取回具有以下格式的数组:['a','b', 'c']忽略正则表达式捕获组使用javascript拆分

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

=>(这就是我想要的)

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

但是当我尝试以确保正则表达式的工作与新线

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

=>(不是我想要的)

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

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

+0

的可能的复制[通过正则表达式拆分JavaScript字符串结果子串包括空切片(http://stackoverflow.com/questions/6105067/JavaScript的弦系分割由正则表达式-结果的子串,包括空分片) – Gael

回答

2

split包括以任何捕获组的内容输出。从MDN

如果分离器是一个包含捕获括号正则表达式,则每次分离器匹配时,捕获括号的结果(包括任何未定义的结果)被拼接到输出阵列。

就你而言,(.|\s)是一个捕获组。因此,输出中会包含空格。解决这个问题的最简单的方法是让一个非捕获组?:

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

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

.filter(Boolean) 
0

使用String.prototype.match()RegExp/[a-z](?=\/|\n|$)/g匹配字符类a通过z尝试随后/字符或换行字符或输入的端

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);