이 코드를 사용하고 있습니다.
s = line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
다음과 같은 문자열에서 숫자를 추출하려면
ABCD1234
ABCD1235
ABCD1236
기타
작동하지만 Ruby에서 이것에 대한 다른 대안이 무엇인지 궁금합니다.
내 코드 :
ids = []
someBigString.lines.each {|line|
   ids << line.match( /ABCD(\d{4})/ ).values_at( 1 )[0]
}
답변
a.map {|x| x[/\d+/]}
답변
http://www.ruby-forum.com/topic/125709에 따라 많은 Ruby 방법이 있습니다 .
line.scan(/\d/).join('')line.gsub(/[^0-9]/, '')line.gsub(/[^\d]/, '')line.tr("^0-9", '')line.delete("^0-9")line.split(/[^\d]/).joinline.gsub(/\D/, '')
콘솔에서 각각을 시도하십시오.
해당 게시물의 벤치 마크 보고서도 확인하십시오.
답변
더 간단한 해결책이 있습니다
line.scan(/\d+/).first
답변
가장 간단하고 빠른 방법은 문자열에서 모든 정수를 가져 오는 것입니다.
str = 'abc123def456'
str.delete("^0-9")
=> "123456"
여기에 제공된 다른 솔루션과 긴 문자열에 대한 벤치 마크를 비교하면 이것이 훨씬 더 빠르다는 것을 알 수 있습니다.
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)
답변
your_input = "abc1cd2"
your_input.split(//).map {|x| x[/\d+/]}.compact.join("").to_i
작동합니다.
답변
또 다른 해결책은 다음과 같이 작성하는 것입니다.
myString = "sami103"
myString.each_char{ |c| myString.delete!(c) if c.ord<48 or c.ord>57 } #In this case, we are deleting all characters that do not represent numbers.
이제 입력하면
myNumber = myString.to_i #or myString.to_f
이것은
답변
문자열에서 숫자 부분을 추출하려면 다음을 사용하십시오.
str = 'abcd1234'
/\d+/.match(str).try(:[], 0)
반환되어야합니다 1234
