2013-08-23 71 views
10

我有這個簡單的字符串:使用拆分將字符串拆分爲2個字符組?

"a1a2a3"

是否有可與split命令一起使用,因此將分割字符串到對任何正則表達式? :

["a1","a2","a3"]

我已經試過這樣:

"a1a2a3".split(/(?=..)/)

但它返回["a", "1", "a", "2", "a3"]

附:

我可以做Match,但即時通訊(如果存在)的正則表達式可以幫助我使用split

+0

你想使用一種可以刪除字符的方法保留字符的動機是什麼? –

+0

這有多高? A1-A100 ...超越? a1-9,b1-9等? – smerny

+0

我想我已經在幾個月前看到了分裂的答案,但是我沒有找到答案。 –

回答

9

split即使長度的字符串:

str.split(/(?=(?:..)*$)/) 

split奇數長度字符串,最後一個條目有單個字符:

str.split(/(?=(?:..)*.$)/) 

這些基本上是超前檢查,檢查前面的字符數是奇數還是偶數。它利用了所有分割位置前面的字符數與字符串長度具有相同的奇偶性。

在(甚至版本)的圖案先行是(?:..)*$,檢查的字符串$結束之前偶數字符(?:..)*的。 (請注意,此處使用非捕獲組(?:pattern),否則捕獲組將在split結果中創建額外條目)。類似的解釋適用於奇數版本。

注意.excludes several new line characters\n\r\u2028\u2029。它會產生意想不到的結果,包含這些字符的字符串將.替換爲[\s\S](或其他等效構造),以使其適用於所有情況。

+0

終於。這可以將一元條件縮短爲1表達式...'str.length%2 == 0? /../:/../' –

+1

+1這非常漂亮 –

4

我已經在聊天中回答了這個問題。你真的應該使用String.prototype.match

可以通過拆分來完成嗎?技術上,是的。您可以將它拆分爲/(..)/,然後過濾掉空白字符串。

"a1a2a3".split(/(..)/).filter(function(a){ 
    return a !== ''; 
}); 
+7

或''a1a2a3「.split(/(..)/)。filter(布爾)' –

+3

@CrazyTrain尼斯!讓我們砍掉一個字節,然後使用String。 '「a1a2a3」.split(/(..)/)。filter(String)' – nderscore

+0

@CrazyTrain ...爲什麼這個工作? –

2

我不知道什麼是輸入字符串的所有可能的格式,但我以爲這是一些字母加一些數字。

如果是的話,你可以嘗試:

var str = 'abc123d56efg8t5' 
var res = str.split(/([a-z]+[0-9]+)/).filter(Boolean); 

輸出:

["abc123", "d56", "efg8", "t5"]