首页 > 解决方案 > 如何打印包含正则表达式模式的每一行并按字母顺序排序?

问题描述

我有一个包含文件名行的 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

但是,我的代码所做的是它只打印日期,而不是整行。除此之外,它甚至不按字母顺序对它们进行排序。如何调整它并让它按照我的意图去做?

标签: ruby-on-railsregexsorting

解决方案


您可以使用

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):线路的其余部分。

推荐阅读