2011-11-05 23 views

Trả lời

43

Chỉ cần thay thế mọi thứ khác.

result = subject.gsub(/[^\d]/, '') 
+4

Bạn cũng có thể sử dụng \ D cho [^ \ d] ...> "Lorem ipsum 123 456 879" .gsub (/ \ D /, '') => "123.456.879" – oylenshpeegul

4
"Lorem 123 ipsum 456 879".scan(/\d+/).join # => "123456879" 
1

Một số câu trả lời đúng đã được đưa ra, trong đó có thể bao gồm những gì bạn muốn sử dụng. Một hơi hơn ở mức độ thấp cách:

"Lorem 123 ipsum 456 879".chars.select {|c| c =~ /\d/}.join 
7

Nếu không có regex:

"Lorem 123 ipsum 456 879".delete('^0-9') #=>"123456879" 
0

Tôi luôn luôn nghĩ rằng bằng cách sử dụng điều ngoặc là dễ dàng hơn để đọc

"nwa240".chars.select {|s| s =~ /[0-9]/} 
4

Các phiên bản từ @steenslag là nhanh nhất, thx!

require 'benchmark' 

class ExtractInt 
    def self.v1(string) 
    string.gsub(/[^\d]/, '') 
    end 

    def self.v2(string) 
    string.gsub(/\D/, '') 
    end 


    def self.v3(string) 
    string.delete('^0-9') 
    end 

    def self.run(m, arg) 
    10000.times do 
     self.send(m, arg) 
    end 
    end 
end 


Benchmark.bmbm do |x| 
    x.report('v1') { ExtractInt.run(:v1, 'AAAA4000') } 
    x.report('v2') { ExtractInt.run(:v2, 'AAAA4000') } 
    x.report('v3') { ExtractInt.run(:v3, 'AAAA4000') } 
end 


# Rehearsal -------------------------------------- 
# v1 0.040000 0.000000 0.040000 ( 0.041564) 
# v2 0.040000 0.000000 0.040000 ( 0.042386) 
# v3 0.010000 0.000000 0.010000 ( 0.011604) 
# ----------------------------- total: 0.090000sec 

#   user  system  total  real 
# v1 0.040000 0.000000 0.040000 ( 0.042176) 
# v2 0.040000 0.000000 0.040000 ( 0.043753) 
# v3 0.010000 0.000000 0.010000 ( 0.012960) 
Các vấn đề liên quan