如何打印包含正则表达式的每一行,并将它们按字母顺序排序?

问题描述 投票:1回答:1

我有一个包含文件名的线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-rails regex sorting
1个回答
1
投票

您可以使用

string.scan(/^([^_]*_(\d++)(.*))/).sort_by { |m,n,z| [n.to_i,z] }.collect{ |m,n,z| m}.join("\n")

Ruby demo

正则表达式将提取所有行成三个元件阵列具有以下值:整行,日期字符串和日期后的字符串。然后,.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](添加require 'date')。

正则表达式的详细信息

  • ^ - 一行的开始
  • ([^_]*_(\d++)(.*)) - 第1组(m):整条生产线满足下列模式: [^_]* - 零或大于_其它更多字符 _ - 下划线 (\d++) - 第2组(n):1+位数,所有格匹配 (.*) - 第3组(z):行的其余部分。
© www.soinside.com 2019 - 2024. All rights reserved.