【问题标题】:Split string on capital letters, but not if preceded by whitespace在大写字母上拆分字符串,但如果前面有空格则不会
【发布时间】:2025-11-28 04:35:01
【问题描述】:

我有一个看起来像这样的字符串

“AaaBbbCcc DddEee”

我要分开了

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

结果是

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

如果大写字母前面有空格,我想要实现的是不拆分字符串,所以结果看起来像

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

【问题讨论】:

  • 你也可以尝试split在非单词边界:\B(?=[A-Z])

标签: ruby regex string


【解决方案1】:
my_string.split(/(?<!\s)(?=[A-Z])/)

这匹配前面没有空格(负向回溯 - (?&lt;!\s))且后跟大写字母(正向预读 - (?=[A-Z]))的位置。

【讨论】:

    【解决方案2】:

    如果您不需要拆分,或者所需匹配项之间的空格数可能不同,您可以使用自己的方法并通过添加 @ 来匹配零个或多个空格 + [A-Z][a-z]+ 序列987654325@子模式:

    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} 匹配任何小写字母。

    【讨论】: