字符串分割正则实现逻辑的代码精简方案咨询
字符串分割代码精简思路
一、从根源避免多余字符:精准匹配正则
你的核心需求是按规则分割数字字符串:优先3字符一组,末尾剩余4字符则拆为两个2字符组,剩余2/3字符保留为一组。如果之前用scan生成了多余空格和连字符,不如直接用更精准的正则匹配,彻底省去后续清理步骤:
def ft(str) str.scan(/\d{3}(?=\d{2,})|\d{2}(?=\d{2}$)|\d{2,3}/) end
正则逻辑说明:
\d{3}(?=\d{2,}):匹配3位数字,要求后续至少还有2位数字(避免提前拆分末尾的4位)\d{2}(?=\d{2}$):匹配2位数字,要求后续恰好还有2位数字到结尾(对应末尾4位拆成两个2位)\d{2,3}:匹配剩余的2位或3位数字(处理末尾剩余不足4位的情况)
测试验证:
- 输入
"123456"→ 返回["123", "456"] - 输入
"1234567891011"→ 返回["123", "456", "789", "10", "11"]
二、精简字符清理逻辑(若保留原有匹配方式)
如果必须保留原有正则匹配逻辑,可将两次gsub操作优化:
- 用
tr_s压缩连续连字符(比gsub处理重复字符更高效),再移除首尾连字符:
cleaned_str = str.tr_s('-', '-').gsub(/^-|-$/, '')
- 或合并为单次
gsub处理(可读性稍弱,但代码更短):
cleaned_str = str.gsub(/(^-+|-+$|-{2,})/) { |m| m == '-' ? '-' : (m.match?(/^-+$/) ? '' : '-') }
内容的提问来源于stack exchange,提问作者Omotayo Obafemi
相关产品推荐
相关产品推荐

