ruby-on-rails - 如何打印包含正则表达式模式的每一行并按字母顺序排序?
问题描述
我有一个包含文件名行的 test_list.txt 文件。每个文件名都包含它们的创建日期。这是它的样子:
test_list.txt:
UTF_06012018_SAMPLE_Control.xlsx
UTF_06022018_SAMPLE_Control.xlsx
UTF_06092018_SAMPLE_Control.xlsx
UTF_06022018_SAMPLE_Control.xlsx
UTF_06082018_SAMPLE_Control.xlsx
UTF_06032018_SAMPLE_Demand.xlsx
UTF_06092018_SAMPLE_Demand.xlsx
UTF_06122018_SAMPLE_Demand.xlsx
UTF_06032018_SAMPLE_Control.xlsx
UTF_06022018_SAMPLE_Demand.xlsx
文件名中的日期格式为 mmddyyyy。此外,还有一些文件是在同一日期创建的。我想要做的是打印与日期的正则表达式匹配的行,并按日期的字母顺序对它们进行排序。
到目前为止,这是我的代码:
path = Dir.glob('/path/to/my/file/*.txt').first
regex = /(\d{1,2}\d{1,2}\d{4})/
samplefile = File.open(path)
string = File.read(samplefile)
string.scan(regex).each do|x|
sorted = x.sort_by { |s| s.scan(/\d+/).first.to_i }
puts sorted
end
但是,我的代码所做的是它只打印日期,而不是整行。除此之外,它甚至不按字母顺序对它们进行排序。如何调整它并让它按照我的意图去做?
解决方案
您可以使用
string.scan(/^([^_]*_(\d++)(.*))/).sort_by { |m,n,z| [n.to_i,z] }.collect{ |m,n,z| m}.join("\n")
请参阅Ruby 演示。
正则表达式会将所有行提取到具有以下值的三元素数组中:整行、日期字符串和日期之后的字符串。然后,.sort_by { |m,n,z| [n.to_i,z] }
将首先按日期字符串排序,然后按日期后的子字符串排序。将.collect{ |m,n,z| m}
仅保留数组元素的第一个值,.join("\n")
并将重新构建结果字符串。
请注意[n.to_i,z]
,您可能希望先解析日期字符串,然后使用[Date.strptime(n,"%d%m%Y"),z]
(add require 'date'
),而不是 。
正则表达式详细信息
^
- 一行的开始([^_]*_(\d++)(.*))
- 第 1 组 (m
):整条线路符合以下模式:[^_]*
- 零个或多个字符_
_
- 一个下划线(\d++)
- 第 2 组 (n
):1 个以上数字,所有格匹配(.*)
- 第 3 组 (z
):线路的其余部分。
推荐阅读
- jenkins - 我可以在声明式/脚本化 Jenkins 管道上使用继承吗?
- javascript - 无法在 javascript 测验中显示正确答案
- c++ - 模板中 std::optional 的基础类型
- c# - 尝试使用列表在 Unity 中创建同一脚本的多个实例
- oracle - 由于 UNION 导致的视图和表列大小不匹配
- javascript - 尝试将图像发送到 Oracle 数据库,但无法正常打开
- python - 尝试从网站获取字典时出现 TypeError
- javascript - 如何更改输入类型=日期日历语言/本地化?
- batch-file - 如何在文本文件中查找字符串并将其打印在屏幕上
- gatsby - 几个月前我使用 gatsby 教程托管了一个网站,但现在不知道它托管在哪里