簡體   English   中英

Ruby:使用Regex匹配分隔符

[英]Ruby: Matching a delimiter with Regex

我正在嘗試使用正則表達式模式解決此問題,即使我的測試通過了該解決方案,我也希望拆分為在數組內僅包含["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 

使用String#scan非常簡單:

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

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

注意 :

如果您有如下所示的字符串,則應使用/\\d+/

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

您得到的數據看起來像這樣的字符串: //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"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM