Ruby 在大写字母上拆分字符串,但如果前面有空格,则不拆分
我有一根看起来像 “AAABBCCC DddEee” 我要和你分享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]))的位置.如果您不需要拆分,或者如果所
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}+)*/)