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

Ruby 在大写字母上拆分字符串,但如果前面有空格,则不拆分,ruby,regex,string,Ruby,Regex,String,我有一根看起来像 “AAABBCCC DddEee” 我要和你分享 my_string.scan(/[A-Z][a-z]+/) 结果是 [“Aaa”、“Bbb”、“Ccc”、“Ddd”、“Eee”] 我想要实现的是,如果大写字母前面有一个空格,则不拆分字符串,因此结果如下所示 [“Aaa”、“Bbb”、“Ccc Ddd”、“Eee”] my_string.split(/(?)? 这将匹配前面没有空格(负前视-(?)且后跟大写字母(正前视-(?=[a-Z]))的位置.如果您不需要拆分,或者如果所

我有一根看起来像

“AAABBCCC DddEee”

我要和你分享

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

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

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

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

my_string.split(/(?)?

这将匹配前面没有空格(负前视-
(?)且后跟大写字母(正前视-
(?=[a-Z])
)的位置.

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

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

要稍微缩短,可以动态构建正则表达式(请参阅):

下面是上述正则表达式()的Unicode友好版本:


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

您也可以尝试在非单词边界处拆分
my_string.scan(/[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*/)
my_string = 'AaaBbbCcc DddEee'
block = "[A-Z][a-z]+"
puts my_string.scan(/#{block}(?:\s+#{block})*/)
my_string.scan(/\p{Lu}\p{Ll}+(?:\s+\p{Lu}\p{Ll}+)*/)