如何不使用While删除Ruby字符串左侧指定重复字符?
解决Ruby中把指定字符视为前导零去除的问题
嘿,这个需求我之前也碰到过类似的,给你几个不用while循环的简洁方案,完美适配你的场景:
方案一:正则表达式替换(最直观)
利用正则匹配开头连续的指定字符,直接替换为空后转成整数就行。还可以封装成通用方法,方便复用:
def strip_leading_specified_char(str, target_char) # 用Regexp.escape处理特殊字符,避免正则语法冲突 str.gsub(/^#{Regexp.escape(target_char)}+/, "").to_i end # 测试你的示例场景 strip_leading_specified_char("2229102", "2") # => 9102 strip_leading_specified_char("9999102", "9") # => 102 strip_leading_specified_char("0009102", "0") # => 9102,和原生转int效果一致
这个方法的好处是代码简洁,可读性强,还能处理目标字符是正则特殊字符(比如.、*)的情况,非常稳妥。
方案二:定位第一个非目标字符的位置
通过index方法找到第一个不等于目标字符的位置,然后从该位置截取字符串再转整数,同样不需要循环:
def strip_leading_specified_char(str, target_char) # 匹配第一个不是目标字符的位置 first_valid_idx = str.index(/[^#{Regexp.escape(target_char)}]/) # 如果全是目标字符,返回0(和Ruby转全零字符串的行为一致) first_valid_idx ? str[first_valid_idx..].to_i : 0 end # 测试边界情况 strip_leading_specified_char("222222", "2") # => 0 strip_leading_specified_char("999102999", "9") # => 102999,只去掉开头的指定字符
这个方法在处理超长字符串时效率也不错,因为index是Ruby内部优化的方法,比手动循环快得多。
两种方案都完全避开了while循环,而且行为和Ruby原生处理前导零的逻辑对齐,完美满足你的需求~
内容的提问来源于stack exchange,提问作者user9450045
相关产品推荐
相关产品推荐

