2013-12-19 101 views
4

我想在%\d+\n上分割一個字符串。我能夠在這兩個中的任何一個成功的分裂,而不是兩個:爲什麼string.split()結果包含undefined?

> msg = 'foo %1 bar \n baz %2' 

> msg.split(/(%\d+)/) 
["foo ", "%1", " bar 
baz ", "%2", ""] 

> msg.split(/(\n)/) 
["foo %1 bar ", " 
", " baz %2"] 

> msg.split(/(\n)|(%\d)/) 
["foo ", undefined, "%1", " bar ", " 
", undefined, " baz ", undefined, "%2", ""] 

在過去的情況下,爲什麼所得數組中undefined,什麼我應該做的?

更新:我忽略說明我需要分隔符。我想要的結果是:

["foo ", "%1", " bar ", "\n", " baz ", "%2"] 
+2

捕獲沒有捕獲任何值的組會產生'undefined' – Bergi

回答

6

引述MDN docString.prototype.split

如果隔板是含有捕獲 括號正則表達式,則每次分離器是匹配的,結果 (包括任何未定義的結果)的俘獲括號是 拼接到輸出數組。

問題是,任何捕獲組是拼接 - 即使是錯過目標。在你的例子中第一個undefined\n(匹配%\d匹配時發生拆分),第二個匹配%\d(匹配\n時)匹配的'虛擬'...你看到圖片。如果你需要一個分離的部分,以及,只使用一個單一的捕獲組

msg.split(/\n|%\d/); // ["foo ", " bar ", " baz ", ""] 

爲了解決這個問題,你就可以擺脫捕獲組的(如交替操作者優先級最低反正):

msg.split(/(\n|%\d)/); 
// ["foo ", "%1", " bar ", "\n", " baz ", "%2", ""] 
+0

謝謝。我忽略了說我需要分開的項目。我會更新我的問題。 –

+0

@espertus更新了我的答案。 – raina77ow

+0

謝謝。我不明白優先順序是否足以知道省略這些分離符的括號。 –

相關問題