,現在我做
樣品輸入a = gets
count = ((a.match(/\d+/)).to_s).to_i.
:2000年3.00
實際產量:2000
樣品輸入:2000年3月
實際輸出:3
目標輸出:兩種情況下均爲2000(跳過浮動)
,現在我做
樣品輸入a = gets
count = ((a.match(/\d+/)).to_s).to_i.
:2000年3.00
實際產量:2000
樣品輸入:2000年3月
實際輸出:3
目標輸出:兩種情況下均爲2000(跳過浮動)
這是您必須知道數據的情況之一。如果你知道你的投入將始終有一個確切的整數,那麼下面的方法將工作:
'3.00 of 2000'.split.select { |e| e =~ /^\d+$/ }.last.to_i
#=> 2000
'2000 of 3.00'.split.select { |e| e =~ /^\d+$/ }.last.to_i
#=> 2000
的想法是輸入的每一行分成數組,然後選擇剛纔包含任何數組元素但數字。最後,數組的最後一個(希望只有)元素被轉換爲一個整數。
有很多方法可能炸燬或無法實現您想要的結果給予任意輸入。但是,它確實適用於您提供的特定語料庫。
使用代碼:
a = gets
a.split(/[\sa-z]+/).select {| v | v !~ /\./ }.last.to_i
# => 2000
沒有正則表達式,但...
'2000 to 3.00'.split.find { |s| s.to_i.to_s == s }.to_i
=> 2000
'3.00 to 2000'.split.find { |s| s.to_i.to_s == s }.to_i
=> 2000
str = '3 of 20.00, +42,31 of 455, -6 of -23.7 .'
str.scan(/(?<![\.\d])(-?\d+)(?!\d*\.)/).flatten.map(&:to_i)
=> [3, 42, 31, 455, -6]
(-?\d+)
由一個或多個數字0-9,任選被前面一個減號。(?<![\.\d])
是一個負向後臺組,意味着捕獲組不能在前面加上小數點或數字。(?!\d*\.)/)
是一個負向預測組,意味着捕獲組不能跟隨零個或多個數字後跟一個小數點。str.scan(/(?<![\.\d])(-?\d+)(?!\d*\.)/) #=> [["3"], ["42"], ["31"], ["455"], ["-6"]]
,這就是爲什麼在轉換爲整數之前必須應用flatten
。(?<!\.\d*)
作爲否定後臺組,但是會產生一個錯誤。原因是:消極後顧不能是可變長度的。我明白在Perl中適用相同的限制。編輯:我不知何故忽略了問題的標題。要對str.scan
結束檢索只是第一個整數,在粘性.first
或替換聲明:
str.match(/(?<![\.\d])(-?\d+)(?!\d*\.)/)[0].to_i
"3.00 of 2000"[/(?<![.\d])\d+(?![.\d])/].to_i # => 2000
"2000 of 3.00"[/(?<![.\d])\d+(?![.\d])/].to_i # => 2000
正則表達式[^0-9.]([0-9]+)[^0-9]
將匹配鄰近字符只有數字這不是數字或點,和捕捉單個捕獲組中的數字。
如果數字也可能出現在字符串的開頭或結尾相鄰,修復應該是不言而喻的;
(?:^|[^0-9.])([0-9]+)(?:[^0-9.]|$)
提問者沒有指出哪個字符可以在整數之前。有一些解釋可能是一個問題:''3.0 a20'[/(?:^ | [^ 0-9。])([0-9] +)(?:[^ 0-9。] | $) /] =>「a20」','「a20」.to_i#=> 0'。請注意,您可以用'\ d'替換0-9。 –
咦?捕獲組仍然只捕獲20. – tripleee
我的歉意。是的,它捕獲了20個(例如'.match(...)[1]');我給出了比賽結果。 –
words_containing_non_digits = -> x {x[/\D/]}
p '3.00 of 2000'.split.reject &words_containing_non_digits #=> ["2000"]
請通過包括你正在使用的語料庫來測試對任何樣品提高你的問題。此外,請包含一份格式正確的**期望輸出樣本**,以便人們瞭解您試圖達到的結果。 –
更新*我道歉 – neil4real
這個問題還不清楚。可以提取的整數是負數還是零?另外,如果不存在整數(例如,nil,:no_integers,零),將返回什麼?請注意,如果整數可以爲零,則不能返回零以指示不存在整數。 –