我有一个字符串,我需要根据大写字母拆分,我的代码在下面
let s = 'OzievRQ7O37SB5qG3eLB';
var res = s.split(/(?=[A-Z])/)
console.log(res);

但是有一个转折,如果大写字母是连续的,我需要正则表达式" eat"直到此序列结束。在上面的示例中,它返回
.. R,Q7,O37,S,B5Q,G3E,L,B
结果应该是
RQ7,O37,SB5q,G3E,LB
思考?谢谢。
答案 0 :(得分:5)
您需要将这些块与/[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字母以外的一个或多个字符(以允许在字符串开头匹配非大写ASCII字母。 g
全局修饰符会让String#match()
返回所有找到的非重叠匹配。