2013-12-17 59 views
-1

**更新正則表達式 - 第一個整數的字符串(跳過浮動)

,現在我做

樣品輸入
a = gets 

count = ((a.match(/\d+/)).to_s).to_i. 

:2000年3.00

實際產量:2000

樣品輸入:2000年3月

實際輸出:3

目標輸出:兩種情況下均爲2000(跳過浮動)

+2

請通過包括你正在使用的語料庫來測試對任何樣品提高你的問題。此外,請包含一份格式正確的**期望輸出樣本**,以便人們瞭解您試圖達到的結果。 –

+0

更新*我道歉 – neil4real

+0

這個問題還不清楚。可以提取的整數是負數還是零?另外,如果不存在整數(例如,nil,:no_integers,零),將返回什麼?請注意,如果整數可以爲零,則不能返回零以指示不存在整數。 –

回答

0

這是您必須知道數據的情況之一。如果你知道你的投入將始終有一個確切的整數,那麼下面的方法將工作:

'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 

的想法是輸入的每一行分成數組,然後選擇剛纔包含任何數組元素但數字。最後,數組的最後一個(希望只有)元素被轉換爲一個整數。

有很多方法可能炸燬或無法實現您想要的結果給予任意輸入。但是,它確實適用於您提供的特定語料庫。

0

使用代碼:

a = gets 

a.split(/[\sa-z]+/).select {| v | v !~ /\./ }.last.to_i 

# => 2000 
0

沒有正則表達式,但...

'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 
0
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 
1
"3.00 of 2000"[/(?<![.\d])\d+(?![.\d])/].to_i # => 2000 
"2000 of 3.00"[/(?<![.\d])\d+(?![.\d])/].to_i # => 2000 
0

正則表達式[^0-9.]([0-9]+)[^0-9]將匹配鄰近字符只有數字這不是數字或點,和捕捉單個捕獲組中的數字。

如果數字也可能出現在字符串的開頭或結尾相鄰,修復應該是不言而喻的;

(?:^|[^0-9.])([0-9]+)(?:[^0-9.]|$) 
+0

提問者沒有指出哪個字符可以在整數之前。有一些解釋可能是一個問題:''3.0 a20'[/(?:^ | [^ 0-9。])([0-9] +)(?:[^ 0-9。] | $) /] =>「a20」','「a20」.to_i#=> 0'。請注意,您可以用'\ d'替換0-9。 –

+0

咦?捕獲組仍然只捕獲20. – tripleee

+0

我的歉意。是的,它捕獲了20個(例如'.match(...)[1]');我給出了比賽結果。 –

0
words_containing_non_digits = -> x {x[/\D/]} 
p '3.00 of 2000'.split.reject &words_containing_non_digits #=> ["2000"] 
相關問題