2013-07-07 62 views
0

我想分割一個字符串使用逗號或空格。逗號可以有空格前後加空格,空格本身也可以作爲分隔符。代碼如下所示:JavaScript的正則表達式拆分產生太多的項目

var answers= s.split(/(\s*,\s*)|\s+/); 

如果s包含字符串 'AB,C',我得到一個包含五個項目,而不是預期的三個列表(陣列):

0:一, 1:undefined,2:b,3:,, 4:c

任何關於我在做什麼錯誤的建議將不勝感激。

Phillip

回答

4

捕獲組的內容被添加到結果數組中。從MDN documentation

如果separator是包含捕獲括號正則表達式,則每次分離器是匹配的捕獲括號的結果(包括任何未定義的結果)被拼接到輸出陣列。但是,並非所有瀏覽器都支持此功能。

使用非捕獲組:

/(?:\s*,\s*)|\s+/ 
1

如果你只是刪除括號,它會工作:

var s = 'a,b,c' 
var answers = s.split(/\s*,\s*|\s+/); 
// [ 'a', 'b', 'c' ] 
8

這是因爲split不也推capturing groups到結果數組:

如果分隔符是正則表達式包含捕獲括號的ssion,然後每次分隔符匹配時,捕獲括號的結果(包括任何未定義的結果)被拼接到輸出數組中。

ab之間的空間是由空格相同,故其捕獲組是未定義的。 bc之間的逗號由組匹配,因此它成爲您的數組中的第四項。

爲了解決這個問題,只是刪除捕獲組:

var answers = s.split(/\s*,\s*|\s+/); 

如果你有一個更復雜的表達式,你需要分組,你可以把非捕獲這樣的:

var answers = s.split(/(?:\s*,\s*)|\s+/); 
0

使用正則表達式,捕獲表達式(x)會記住匹配(並可能返回到String.split)。您應該使用(非捕獲)分組表達式(?:x)。見例如更多Mozilla Docs on RegExp

+0

這是巨大的。感謝所有回答的人! 我還有一個殘留問題。如果輸入字符串爲空,我會得到一個長度爲1的列表,其中第一項是空字符串,而不是我預期的長度爲零的列表。 –

+0

我能解決這個用下面的,儘管它好像這不應該是必要的: ' 如果(answers.length == 1個&&答案[0] ==「」){ 答案= [ ]。 } ' –