在Ruby中使用多个正则表达式过滤文本文件

时间:2019-02-14 14:19:32

标签: regex ruby

我的文本文件包含以下文本,需要根据条件进行过滤。

CODE=0xea00e60c  
CODE=0xea00e60d  
OUTPUT="HW Address: 91183010\n,HWType:00000030\n"  
CODE=0xea00e60e  
CODE=0xea01ff00

如果该行以CODE开头,则从第一行提取0x(例如ea00e60c)之后的所有内容,然后粘贴到 xyz 文件中。 如果该行以OUTPUT开头,请提取所有双引号并将其粘贴到 xyz 文件中。应保持提取文本并将其放入 XYZ 文件的顺序。

  def filter_logs(filename)
    postcode = "postcode_logs"
    File.open(filename, 'r').each do |line|
      result = (line.scan(/"(.*?)"/)) || (line.split("x")[1])
      File.open(postcode, 'a') do |selected_line|
        selected_line.puts(result)
      end
    end
  end

文件名和邮政编码已被文件定义。

代码中没有错误,但输出也不存在。

**Expected output**

  ea00e60c  
  ea00e60d  
  HW Address: 91183010\n,HWType:00000030\n  
  ea00e60e  
  ea01ff00



**current output**
HW Address: 91183010\n,HWType:00000030\n

1 个答案:

答案 0 :(得分:1)

此操作未成功的原因是,#scan总是成功。如果未找到任何内容,则返回一个空数组(其值为真)。只需获得第一个结果就足够了(对于空数组返回nil):

result = line.scan(/"(.*?)"/).first || line.split("x")[1]

尽管您也可以使用其他技术,例如:

result   = line[/\ACODE=0x(\h*)/, 1]
result ||= line[/\AOUTPUT="([^"]*)"/, 1]

从字符串的开头匹配CODE=0x,后跟零个或多个十六进制字符(\h*),将它们捕获在组1中;或者OUTPUT=",然后跟零或多个非引号字符([^"]*)在第1组中捕获它们,然后是"

如果尚不清楚正则表达式,请检查regular expression documentation for Ruby。如果不清楚方括号方法的使用情况,请查看documentation of the square bracket accessor of String