Ruby:Gsub - 单行中的多个字符串替换[在数组中]

时间:2014-05-08 07:25:31

标签: ruby-on-rails ruby regex

有没有办法使用gsub替换单行数组中的多个字符串。

这是日志文件

13:29:00 (alex) OUT: "72500_2010_0F" abcd@S400532  
13:31:12 (alex) IN: "72600_2010_0F" abnc@S403818
13:31:52 (alex) IN: "71200_2010_0F" osa@S400583

我想替换下面的

(alex) with "" 
OUT:  with OUT
IN: with IN
"72500_2010_0F" with XYZ
"71200_2010_0F" with QWE
"72600_2010_0F" with UIO

将原始文件(日志文件)放入数组中,我想读取数组中的每一行并执行gsub。不想使用哈希作为它的复杂 - 作为Ruby初学者...&到正则表达式......

array1.each do |element|
  i = element.gsub(/?????????/) [ What should go here]
  array2.push(i)
end

我希望对原始数组进行更改,但是将修改后的行推送到不同的数组,即array2

什么是最好的&这个易于理解的代码? - 请帮忙

1 个答案:

答案 0 :(得分:4)

String#sub,似乎有很多方法可以做你想做的事情:

  1. 一种方法可以是使用哈希作为第二个参数

    def cleansed_log_line(line)
      replacement_rules = {
        'alex' => '',
        'OUT: ' => 'OUT ',
        'IN: ' => 'IN '
      }
      matcher = /#{replacement_rules.keys.join('|')}/
    
      line.gsub(matcher, replacement_rules)
    end
    
  2. 另一种方法是使用阻止形式

    def cleansed_log_line(line)
      replacement_rules = {
        'alex' => '',
        'OUT: ' => 'OUT ',
        'IN: ' => 'IN '
      }
      matcher = /#{replacement_rules.keys.join('|')}/
    
      line.gsub(matcher) do |match|
        replacement_rules[match] || match
      end
    end
    
  3. 另一个不太好的实现

    def cleansed_log_line(line)
      replacement_rules = {
        /alex/ => '',
        'OUT: ' => 'OUT ',
        'IN: ' => 'IN '
      }
    
      replacement_rules.each do |match, replacement|
        line = line.gsub(match, replacement)
      end
    
      line
    end
    
  4. 哈希和RegEx无需担心。此函数可以清除传递给它的任何行,并返回清理的行。