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

3

我有一个字符串需要根据大写字母进行分割,以下是我的代码:

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

但是有一个问题,如果大写字母是连续的,我需要正则表达式“吃掉”这个序列,直到这个序列结束。在上面的例子中,它返回..R,Q7,O37,S,B5q,G3e,L,B。结果应该是RQ7,O37,SB5q,G3e,LB。你有什么想法?谢谢。

1
'OzievRQ7O37SB5qG3eLB'.match(/[A-Z]+[^A-Z]+/g) ? - Andrey
@Andrey 把它作为答案发布 - Mihai
Wiktor搞定了 :) 他的正则表达式实际上更好。 - Andrey
1个回答

5
你需要使用/[A-Z]+[^A-Z]*|[^A-Z]+/g来匹配这些块,而不是使用零宽断言模式进行分割,因为后者(在你的情况下,它只是一个正向先行断言的正则表达式)必须检查字符串内的每个位置,而且无法告诉正则表达式在找到lookaround模式后跳过一个位置。

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

请查看regex101.com上的在线正则表达式演示

详细信息:

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

g全局修饰符将使String#match()返回所有找到的非重叠匹配项。


如果输入可能以非大写字母开头,你可以将[^A-Z]+作为正则表达式的替代部分:'aBc'.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g)返回["a", "Bc"] - Dmitry Egorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接