如何拆分包含驼峰文本与连续数字组的字符串并保留数字分组?
问题原因
你当前使用的正则中(?!\\p{Lu})(?=\\d+)逻辑存在缺陷:(?=\\d+)会匹配每一个数字字符前方的位置,因此连续数字会在每个数字前都触发拆分,最终被拆分为单个字符。
解决方案
使用如下支持Unicode的正则即可实现预期拆分效果:
(?=\p{Lu})|(?<=\D)(?=\d)|(?<=\d)(?=\D)
效果验证
对示例字符串"abcDefGhi345J6"执行拆分:
// 示例(Java环境,其他支持Unicode属性转义的环境逻辑一致) "abcDefGhi345J6".split("(?=\\p{Lu})|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
输出结果符合预期:
["abc", "Def", "Ghi", "345", "J", "6"]
正则逻辑说明
(?=\p{Lu}):正向零宽预查,匹配任意Unicode大写字母前方的位置,实现驼峰拆分,兼容所有语言的大写字母(?<=\D)(?=\d):正向零宽预查,匹配「非数字字符后方、数字字符前方」的交界位置,仅在字母切换到数字时拆分(?<=\d)(?=\D):正向零宽预查,匹配「数字字符后方、非数字字符前方」的交界位置,仅在数字切换到字母时拆分
Shell环境使用说明
如果在Shell中使用该正则,需要确保工具支持Unicode属性转义与零宽断言,推荐使用Perl实现,示例如下:
echo "abcDefGhi345J6" | perl -CSDA -e 'print join(", ", split /(?=\p{Lu})|(?<=\D)(?=\d)|(?<=\d)(?=\D)/, <STDIN>)'
内容的提问来源于stack exchange,提问作者Mikael Johansson
相关产品推荐
相关产品推荐

