我有一个看起来像
的字符串" 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;]
答案 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}
匹配任何小写字母。