如何在Ruby中用正则将字符串分割为符合规则的单词数组?
解决字符串按多规则拆分单词的问题
我明白你的问题了——你的正则现在会把连续大写字母拆成单个字符,这是因为(?=[A-Z]+)会在每个大写字母前插入拆分点,哪怕这些大写字母是连在一起的。咱们来调整正则,同时满足所有规则,甚至可以让逻辑更简洁:
修改思路
针对你的需求,我们需要调整拆分逻辑,覆盖所有规则:
- 分隔符处理:用
[-_.\s]+匹配连续的连字符、空格、下划线和句点,确保连续分隔符只触发一次拆分 - 大小写拆分:只在两种合理的位置拆分:
- 小写字母紧跟大写字母的位置(比如
theQuick中e和Q之间),对应规则3 - 大写字母紧跟「大写+小写」组合的位置(比如
ABCDef中C和D之间),对应规则4,保证连续大写字母被归为一组
- 小写字母紧跟大写字母的位置(比如
修改后的代码
class String def split_words split(/[-_.\s]+|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/) .map(&:downcase) .reject(&:empty?) end end
测试验证
用你的测试用例验证:
"theQuick--brown_fox JumpsOver___the.lazy DOG".split_words # 返回:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
其他场景测试:
"DOG".split_words→["dog"](连续大写字母归为一组)"LETS_GO".split_words→["lets", "go"](符合规则4)"the--.quick".split_words→["the", "quick"](连续分隔符只拆分一次)"theQuickBrown".split_words→["the", "quick", "brown"](符合规则3)
这个实现完全满足你列出的所有规则,而且只用正则完成了核心拆分逻辑。
内容的提问来源于stack exchange,提问作者Josh Hadik
相关产品推荐
相关产品推荐

