2017-03-15 126 views
2

我有一個字符串,我需要根據大寫字母分割,我下面如何拆分基於大寫字母的字符串?

let s = 'OzievRQ7O37SB5qG3eLB'; 
 
var res = s.split(/(?=[A-Z])/) 
 
console.log(res);

但是有一個扭曲,如果大寫字母是連續的,我需要的正則表達式「吃代碼「直到該序列ends.In上面的例子中它返回

..R,Q7,O37,S,B5Q,G3E,L,B

而且結果應該是

RQ7,O37,SB5q,G3e,LB

想法?謝謝。

+1

「OzievRQ7O37SB5qG3eLB'.match(/ [A-Z] + [^ A-Z] + /克)? – Andrey

+0

@Andrey張貼作爲一個答案 – Mihai

+0

Wiktor的了吧:)他的正則表達式實際上是更好的 – Andrey

回答

4

您需要將這些塊與/[A-Z]+[^A-Z]*|[^A-Z]+/g匹配,而不是使用零寬度斷言模式進行拆分,因爲後者(在您的情況下,它只是一個正向超前正則表達式)將不得不檢查字符串中的每個位置,不可能告訴正則表達式在查找模式被發現後跳過一個位置。

s = 'and some text hereOzievRQ7O37SB5qG3eLB'; 
 
console.log(s.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g));

online regex demo at regex101.com

詳細

  • [A-Z]+ - 一個或多個大寫ASCII字母
  • [^A-Z]* - 零個或多個(允許匹配大寫只有塊),比ASCII大寫字母
  • |煤焦等 - 或
  • [^A-Z]+ - 比大寫ASCII其他一個或多個字符讓ters(允許在字符串的開頭匹配非大寫的ASCII字母)。

g全局修飾符將讓String#match()返回所有找到的非重疊匹配項。

+0

如果輸入可能潛在地非大寫字母,您可以添加'開始[^ AZ] +'作爲替代正則表達式: ''aBc'.match(/ [AZ] + [^ AZ] * | [^ AZ] + /克)'返回'[ 「一」, 「BC」]' –

+0

是的,這是正確的。我調整了答案。 –