我想分割一個字符串使用逗號或空格。逗號可以有空格前後加空格,空格本身也可以作爲分隔符。代碼如下所示:JavaScript的正則表達式拆分產生太多的項目
var answers= s.split(/(\s*,\s*)|\s+/);
如果s
包含字符串 'AB,C',我得到一個包含五個項目,而不是預期的三個列表(陣列):
0:一, 1:undefined,2:b,3:,, 4:c
任何關於我在做什麼錯誤的建議將不勝感激。
Phillip
我想分割一個字符串使用逗號或空格。逗號可以有空格前後加空格,空格本身也可以作爲分隔符。代碼如下所示:JavaScript的正則表達式拆分產生太多的項目
var answers= s.split(/(\s*,\s*)|\s+/);
如果s
包含字符串 'AB,C',我得到一個包含五個項目,而不是預期的三個列表(陣列):
0:一, 1:undefined,2:b,3:,, 4:c
任何關於我在做什麼錯誤的建議將不勝感激。
Phillip
捕獲組的內容被添加到結果數組中。從MDN documentation:
如果
separator
是包含捕獲括號正則表達式,則每次分離器是匹配的捕獲括號的結果(包括任何未定義的結果)被拼接到輸出陣列。但是,並非所有瀏覽器都支持此功能。
使用非捕獲組:
/(?:\s*,\s*)|\s+/
如果你只是刪除括號,它會工作:
var s = 'a,b,c'
var answers = s.split(/\s*,\s*|\s+/);
// [ 'a', 'b', 'c' ]
這是因爲split
不也推capturing groups到結果數組:
如果分隔符是正則表達式包含捕獲括號的ssion,然後每次分隔符匹配時,捕獲括號的結果(包括任何未定義的結果)被拼接到輸出數組中。
a
和b
之間的空間是由空格相同,故其捕獲組是未定義的。 b
和c
之間的逗號由組匹配,因此它成爲您的數組中的第四項。
爲了解決這個問題,只是刪除捕獲組:
var answers = s.split(/\s*,\s*|\s+/);
如果你有一個更復雜的表達式,你需要分組,你可以把非捕獲這樣的:
var answers = s.split(/(?:\s*,\s*)|\s+/);
使用正則表達式,捕獲表達式(x)
會記住匹配(並可能返回到String.split
)。您應該使用(非捕獲)分組表達式(?:x)
。見例如更多Mozilla Docs on RegExp。
這是巨大的。感謝所有回答的人! 我還有一個殘留問題。如果輸入字符串爲空,我會得到一個長度爲1的列表,其中第一項是空字符串,而不是我預期的長度爲零的列表。 –
我能解決這個用下面的,儘管它好像這不應該是必要的: ' 如果(answers.length == 1個&&答案[0] ==「」){ 答案= [ ]。 } ' –