在大写字母上拆分字符串,但如果前面有空格则不会

时间:2016-11-07 13:49:38

标签: ruby regex string

我有一个看起来像

的字符串
  

" AaaBbbCcc DddEee"

我用

拆分它
my_string.scan(/[A-Z][a-z]+/)

,结果是

  

[&#34; Aaa&#34;,&#34; Bbb&#34;,&#34; Ccc&#34;,&#34; Ddd&#34;,&#34; Eee&#34;] < / p>

我想要实现的是,如果大写字母前面有空格,则不拆分字符串,因此结果看起来像

  

[&#34; Aaa&#34;,&#34; Bbb&#34;,&#34; Ccc Ddd&#34;,&#34; Eee&#34;]

2 个答案:

答案 0 :(得分:6)

my_string.split(/(?<!\s)(?=[A-Z])/)

这会匹配前面没有空格的位置(负面后瞻 - (?<!\s)),后面跟一个大写字母(正向前瞻 - (?=[A-Z]))。

答案 1 :(得分:1)

如果您不需要拆分,或者所需匹配之间的空格数可能不同,您可以使用自己的方法并另外匹配零个或多个空格序列+ [A-Z][a-z]+ by添加(?:\s+[A-Z][a-z]+)*子模式:

my_string.scan(/[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*/)

请参阅Ruby demo

为了缩短它,您可以动态构建正则表达式(请参阅demo here):

my_string = 'AaaBbbCcc DddEee'
block = "[A-Z][a-z]+"
puts my_string.scan(/#{block}(?:\s+#{block})*/)

这是上述正则表达式(online demo)的Unicode友好版本:

my_string.scan(/\p{Lu}\p{Ll}+(?:\s+\p{Lu}\p{Ll}+)*/)

其中\p{Lu}匹配任何大写字母,\p{Ll}匹配任何小写字母。