如何从字符串数组提取完整数字?Ruby grep正则优化及替代方案
解决Ruby数组提取完整数字的问题
问题原因
你之前用array.grep(/\d+/, &:to_i)只拿到每个数字串的首个整数,是因为正则/\d+/仅匹配连续的纯数字序列,遇到逗号、小数点这类非数字字符就会停止匹配。比如"9,999.00"里,它只会匹配开头的"9",后面的,999.00被截断,所以转成整数9。
一行代码解决方案
下面两种方式都能提取完整数字并转成数值:
方案1:改进grep匹配逻辑
先匹配包含千分位逗号、小数点的完整数字串,再清理格式转成数值:
array.grep(/\d[,\d.]*\d/).map { |str| str.delete(',').to_f }
执行后结果:[9999.0, 4948.0],如果需要整数,把to_f换成to_i即可。
方案2:用flat_map+scan更灵活
如果数组中存在单个字符串含多个数字的场景,这个方法更稳妥:
array.flat_map { |s| s.scan(/\d+(?:[,.]\d+)*/) }.map { |num| num.gsub(',', '').to_f }
正则\d+(?:[,.]\d+)*专门匹配带千分位或小数的数字格式,确保不会遗漏任何有效数字部分。
内容的提问来源于stack exchange,提问作者gul Ranaa
相关产品推荐
相关产品推荐

