分裂,我需要字符串"thisIs12MyString"
拆分到一個數組看起來像[ "this", "Is", "12", "My", "String" ]
正則表達式的大寫和第一位
我那麼遠,"thisIs12MyString".split(/(?=[A-Z0-9])/)
了,但它分割上的每個數字,並給出了陣列[ "this", "Is", "1", "2", "My", "String" ]
因此,我需要將大寫字母和數字前面沒有其他數字的字符串拆分。
分裂,我需要字符串"thisIs12MyString"
拆分到一個數組看起來像[ "this", "Is", "12", "My", "String" ]
正則表達式的大寫和第一位
我那麼遠,"thisIs12MyString".split(/(?=[A-Z0-9])/)
了,但它分割上的每個數字,並給出了陣列[ "this", "Is", "1", "2", "My", "String" ]
因此,我需要將大寫字母和數字前面沒有其他數字的字符串拆分。
你在找這個?
"thisIs12MyString".match(/[A-Z]?[a-z]+|[0-9]+/g)
回報
["this", "Is", "12", "My", "String"]
+1到目前爲止最好的回答。我不明白我是怎麼忘記'比賽'的! – 2012-02-26 14:00:34
你沒有受到OP的重點是分裂字符串的事實.... +1 :) – 2012-02-26 14:04:56
我想不出有什麼辦法可以通過RegEx實現這一點。
我認爲你需要在代碼中完成它。
,請檢查網址,同樣的問題,不同的語言(紅寶石) - >
的代碼是在底部: http://code.activestate.com/recipes/440698-split-string-on-capitalizeduppercase-char/
正如我在我的評論說,我的辦法是插入一個特殊第一字符的位數每個序列之前,作爲標記:
"thisIs12MyString".replace(/\d+/g, '~$&').split(/(?=[A-Z])|~/)
其中~
可以是任何其它字符,優選非PR (例如)一個控制字符),因爲它不可能在一個字符串中「自然地」出現。
在這種情況下,你甚至可以插入每個大寫字母之前標記爲好,並省略先行,在切很容易:
"thisIs12MyString".replace(/\d+|[A-Z]/g, '~$&').split('~')
它可能會或可能不會有更好的表現。
你可以使用你當前的正則表達式修復在數組拆分上使用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;
}
});
在我的犀牛控制檯,
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
@Jesper哦,它實際上相當棘手,因爲JavaScript不處理lookbehinds。 – 2012-02-26 13:30:01
用一個正則表達式來做這件事很重要嗎?爲什麼不把它分解成兩部分?它可能會增加可讀性。 – davin 2012-02-26 13:32:57
我不認爲你可以沿着前瞻或甚至一個表達來做到這一點(也就是說,我不認爲自己是一個正則表達式專家)。一個想法可能是在每個數字序列之前插入一個特殊字符,並由該字符分割。 – 2012-02-26 13:33:13