我有一根绳子看起来像
"AaaBbbCcc DddEee"
我要把它和
my_string.scan(/[A-Z][a-z]+/)
结果是
[“Aaa”、“Bbb”、“Ccc”、“Ddd”、“Eee”]
我想要实现的是,如果大写字母前面有空格,则不拆分字符串,因此结果如下所示
[“Aaa”、“Bbb”、“Ccc Ddd”、“Eee”]
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}
匹配任何小写字母。