提问者:小点点

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


我有一根绳子看起来像

"AaaBbbCcc DddEee"

我要把它和

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

结果是

[“Aaa”、“Bbb”、“Ccc”、“Ddd”、“Eee”]

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

[“Aaa”、“Bbb”、“Ccc Ddd”、“Eee”]


共2个答案

匿名用户

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

这匹配前面没有空格的位置(负查找-(?

匿名用户

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

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

查看Ruby演示

为了缩短它,您可以动态构建正则表达式(请参阅此处的演示):

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

这是上述正则表达式的Unicode友好版本(在线演示):

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

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