Cách đơn giản và nhanh nhất là lấy tất cả các số nguyên ra khỏi chuỗi.
str = 'abc123def456'
str.delete("^0-9")
=> "123456"
So sánh các điểm chuẩn trên một chuỗi dài với một số giải pháp khác được cung cấp ở đây, chúng ta có thể thấy đây là mức độ nhanh hơn:
require 'benchmark'
@string = [*'a'..'z'].concat([*1..10_000].map(&:to_s)).shuffle.join
Benchmark.bm(10) do |x|
x.report(:each_char) do
@string.each_char{ |c| @string.delete!(c) if c.ord<48 or c.ord>57 }
end
x.report(:match) do |x|
/\d+/.match(@string).to_s
end
x.report(:map) do |x|
@string.split.map {|x| x[/\d+/]}
end
x.report(:gsub) do |x|
@string.gsub(/\D/, '')
end
x.report(:delete) do
@string.delete("^0-9")
end
end
user system total real
each_char 0.020000 0.020000 0.040000 ( 0.037325)
match 0.000000 0.000000 0.000000 ( 0.001379)
map 0.000000 0.000000 0.000000 ( 0.001414)
gsub 0.000000 0.000000 0.000000 ( 0.000582)
delete 0.000000 0.000000 0.000000 ( 0.000060)
map
nên hiểu ngữ nghĩa của nó như thế nào? Tôi hiểucollect
nhưng tôi luôn gặp khó khăn khi hiểu bản đồ.