首页 > 解决方案 > 在 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

标签: regexruby

解决方案


这不成功的原因是因为#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 中捕获它们,然后是 a "

如果对正则表达式有任何不清楚的地方,请查看Ruby 的正则表达式文档。如果对方括号方法的使用有任何不清楚的地方,请查看String 的方括号访问器的文档。


推荐阅读