2012-02-26 17 views
4

分裂,我需要字符串"thisIs12MyString"拆分到一個數組看起來像[ "this", "Is", "12", "My", "String" ]正則表達式的大寫和第一位

我那麼遠,"thisIs12MyString".split(/(?=[A-Z0-9])/)了,但它分割上的每個數字,並給出了陣列[ "this", "Is", "1", "2", "My", "String" ]

因此,我需要將大寫字母和數字前面沒有其他數字的字符串拆分。

+0

@Jesper哦,它實際上相當棘手,因爲JavaScript不處理lookbehinds。 – 2012-02-26 13:30:01

+0

用一個正則表達式來做這件事很重要嗎?爲什麼不把它分解成兩部分?它可能會增加可讀性。 – davin 2012-02-26 13:32:57

+0

我不認爲你可以沿着前瞻或甚至一個表達來做到這一點(也就是說,我不認爲自己是一個正則表達式專家)。一個想法可能是在每個數字序列之前插入一個特殊字符,並由該字符分割。 – 2012-02-26 13:33:13

回答

9

你在找這個?

"thisIs12MyString".match(/[A-Z]?[a-z]+|[0-9]+/g) 

回報

["this", "Is", "12", "My", "String"] 
+0

+1到目前爲止最好的回答。我不明白我是怎麼忘記'比賽'的! – 2012-02-26 14:00:34

+0

你沒有受到OP的重點是分裂字符串的事實.... +1 :) – 2012-02-26 14:04:56

3

正如我在我的評論說,我的辦法是插入一個特殊第一字符的位數每個序列之前,作爲標記

"thisIs12MyString".replace(/\d+/g, '~$&').split(/(?=[A-Z])|~/) 

其中~可以是任何其它字符,優選非PR (例如)一個控制字符),因爲它不可能在一個字符串中「自然地」出現。

在這種情況下,你甚至可以插入每個大寫字母之前標記爲好,並省略先行,在切很容易:

"thisIs12MyString".replace(/\d+|[A-Z]/g, '~$&').split('~') 

它可能會或可能不會有更好的表現。

0

你可以使用你當前的正則表達式修復在數組拆分上使用JS的lookbehinds失蹤。
快速僞代碼:

var result = []; 
var digitsFlag = false; 
"thisIs12MyString".split(/(?=[A-Z0-9])/).forEach(function(word) { 

    if (isSingleDigit(word)) { 
     if (!digitsFlag) { 
      result.push(word); 
     } else { 
      result[result.length - 1] += word; 
     } 
     digitsFlag = true; 
    } else { 
     result.push(word); 
     digitsFlag = false; 
    } 

}); 
1

在我的犀牛控制檯,

js> "thisIs12MyString".replace(/([A-Z]|\d+)/g, function(x){return " "+x;}).split(/ /); 
this,Is,12,My,String 

一個又一個,

js> "thisIs12MyString".split(/(?:([A-Z]+[a-z]+))/g).filter(function(a){return a;}); 
this,Is,12,My,String