如何在Ruby中从字符串中删除所有非数字字符?

31

用户以以下形式输入数字:

1-800-432-4567
800-432-4567
800.432.4566
(800)432.4567
+1(800)-432-4567
800 432 4567

我希望所有这些内容被转换成剥离特殊字符的版本,例如18004324567。数据以String的形式呈现,因此不需要进行字符串检查。

我的方法如下:

def canonical_form number
  a = remove_whitespaces number #to clear all whitespaces in between
  a.gsub(/[()-+.]/,'')     
end

def remove_whitespaces number
  number.gsub(/\s+/,'')  #removes all whitespaces
end

有没有更好的方法来处理这个问题?在canonical_form方法中,可以使用正则表达式检查空格,而不需要额外的空格方法吗?如何重构或以更整洁的方式完成这项任务?


3
尝试使用number.gsub(/\D/, '')来删除所有非数字字符。 - sschmeck
number.gsub(/\D+/, '') - Tushar
1
通过在问题中标记正则表达式或在标题中编写gsub,您会限制答案。 - sawa
3个回答

60
如果 String 的 tr 方法的第一个参数以 ^ 开头,则表示除了列出的字符以外的所有字符。
def canonical_form str
  str.tr('^0-9', '')   
end

27
str.delete('^0-9') 翻译成中文:删除字符串中除数字以外的所有字符。 - Stefan

55

以下是几个解决方案 - 我进行了一些基准测试,以防有人感兴趣:

str = "1-800-432-4567"
Benchmark.ms { 10000.times{str.scan(/\d/).join} }
#=> 69.4419999490492 

Benchmark.ms { 10000.times{str.delete('^0-9')} }
#=> 7.574999995995313 

Benchmark.ms { 10000.times{str.tr('^0-9', '')} }
#=> 7.642999989911914

Benchmark.ms { 10000.times{str.gsub(/\D+/, '')} }
#=> 28.084999998100102

2
我知道有点晚了,但还是谢谢你做这件事。 - nzajt
喜欢最简单的解决方案也是最快的... - Rob Carpenter

4

不要移除特殊字符,可以查找所有数字。类似这样:

str = "1-800-432-4567"
str.scan(/\d/).join
#=> "18004324567"

str = "(800)432.4567"
str.scan(/\d/).join
#=> "8004324567"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接