如何基于大写字母拆分字符串?

Mih*_*hai 3 javascript regex split

我有一个字符串,我需要根据大写字母拆分,我的代码如下

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

但是有一个转折,如果大写字母是连续的,我需要正则表达式"吃"直到这个序列结束.在上面的例子中它返回

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

结果应该是

RQ7,O37,SB5q,G3E,LB

思考?谢谢.

Wik*_*żew 5

您需要匹配这些块/[A-Z]+[^A-Z]*|[^A-Z]+/g而不是使用零宽度断言模式进行拆分,因为后者(在您的情况下,它只是正向前搜索正则表达式)将必须检查字符串内的每个位置,并且无法告诉一旦找到环绕模式,正则表达式就跳过一个位置.

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

请参阅regex101.com上在线正则表达式演示.

细节:

  • [A-Z]+ - 一个或多个大写ASCII字母
  • [^A-Z]*- 零或更多(仅允许匹配大写字母块)字符而不是大写ASCII字母
  • | - 要么
  • [^A-Z]+ - 除大写ASCII字母以外的一个或多个字符(以允许在字符串开头匹配非大写ASCII字母.

g全球的修改会让String#match()返回所有发现的非重叠的匹配.