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
解决方案
这不成功的原因是因为#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 的方括号访问器的文档。
推荐阅读
- php - 如何使用 php 函数而不是默认的 WP 函数从主页中排除类别?
- javascript - 使用 ngFor 时折叠某些表格/单元格的好方法
- module - 在 drupal 8 中启用更新管理器模块
- css - 如何将复选框和表单中的标签居中
- c# - Angular 8将图像上传到ApiController c#从Angular 7升级后停止工作
- ios - 从 healthkit 获取所有可穿戴数据
- python - Python:在完全不同的进程之间共享队列
- java - 单体应用的自动重构
- angular - IdentityServer 外部身份验证提供程序 - 身份验证回调 - 重定向 - 400 错误请求
- html - GetUIKit 不显示按钮周围的矩形