2014-02-26 61 views
1

我試圖用正則表達式模式來解決這個問題,即使我的測試通過了這個解決方案,我想分割成在陣列中只有["1", "2"]。有沒有更好的方法來做到這一點?紅寶石:與正則表達式匹配的分隔符

IRB測試

s = "//;\n1;2" # when given a delimiter of ';' 

s2 = "1,2,3" # should read between commas 

s3 = "//+\n2+2" # should read between delimiter of '+' 

s.split(/[,\n]|[^0-9]/) 

=> ["", "", "", "", "1", "2"] 

生產

module StringCalculator 
    def self.add(input) 
    solution = input.scan(/\d+/).map(&:to_i).reduce(0, :+) 
    input.end_with?("\n") ? nil : solution 
    end 
end 

測試

context 'when given a newline delimiter' do                               
    it 'should read between numbers' do                                
    expect(StringCalculator.add("1\n2,3")).to eq(6)                             
    end                                        

    it 'should not end in a newline' do                                
    expect(StringCalculator.add("1,\n")).to be_nil                             
    end                                        
end 

context 'when given different delimiter' do                               
    it 'should support that delimiter' do                               
    expect(StringCalculator.add("//;\n1;2")).to eq(3)                            
    end                                       
end 
+0

時,你會改變你的帖子,寫一個字**編輯**,並把新的內容。不要刪除第一篇文章。如果你刪除的人會認爲我* STUPID *,希望你明白。 –

+0

明白了,我已經對問題有了更多的瞭解。 @ArupRakshit – theGrayFox

+1

「1,2,3」的預期輸出? –

回答

1

很簡單的使用String#scan

s = "//;\n1;2" 
s.scan(/\d/) # => ["1", "2"] 

/\d/ - 一個數字字符([0-9]

注:

如果你有一個像下面接着一個字符串,你應該使用/\d+/

s = "//;\n11;2" 
s.scan(/\d+/) # => ["11", "2"] 
+0

我已經完成了第一次,但問題是我想要實際讀取這些字符之間的數字。我覺得我在掃描作弊哈哈。 http://osherove.com/tdd-kata-1/ – theGrayFox

+0

說實話,在'^ 0-9'處分割與'0-9'的掃描非常相似#-) –

+0

@ p11y否..見這個s =「//; \ n11; 2」 s.split(/ [^ 0-9] /)#=> [「」,「」,「」,「」,「11」,「2」 ]',那麼你也需要做額外的工作,清除''「'。 –

1

你得到像這樣的字符串數據://1\n212

如果你得到的數據作爲文件,然後把它當作兩個獨立的線路。如果它是一個字符串,那麼再次將它視爲兩條單獨的行。在任一情況下,它看起來像

//1 
212 

當輸出。

如果它是一個字符串:

input = "//1\n212".split("\n") 
delimiter = input.first[2] # => "1" 
values = input.last.split(delimiter) # => ["2", "2"] 

如果它是一個文件:

line = File.foreach('foo.txt') 
delimiter = line.next[2] # => "1" 
values = line.next.chomp.split(delimiter) # => ["2", "2"] 
+0

我用類方法add()'''編寫的模塊只傳遞了一個字符串。儘管這不在規範中涵蓋,但我希望涵蓋所有的結果。我沒有爲這個問題寫一個測試,但是我認爲當這樣的情況得到滿足時我可以提出一個錯誤。感謝您的洞察力。 – theGrayFox