2016-03-03 64 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);