【问题标题】:How to split a string based of capital letters?如何根据大写字母拆分字符串?
【发布时间】:2017-03-15 08:50:54
【问题描述】:

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

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

想法?谢谢。

【问题讨论】:

  • 'OzievRQ7O37SB5qG3eLB'.match(/[A-Z]+[^A-Z]+/g) ?
  • @Andrey 将其作为答案发布
  • Wiktor 明白了 :) 他的正则表达式实际上更好

标签: javascript regex split


【解决方案1】:

您需要将这些块与/[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() 返回所有找到的非重叠匹配项。

【讨论】:

  • 如果输入可能以非大写字母开头,您可以添加[^A-Z]+ 作为正则表达式的替代:'aBc'.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g) 返回["a", "Bc"]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2011-05-28
  • 2019-08-08
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多