在 Ruby 中与文件名中的特殊字符进行有效的文件匹配

Efficient file matching in Ruby with special characters in filenames

提问人:Alex Nikolsky 提问时间:6/7/2023 最后编辑:Alex Nikolsky 更新时间:6/8/2023 访问量:79

问:

我正在开发一个涉及大量文本文件(数百万个)的 Ruby 应用程序。这些文件中的每一个都称为双字符字符串,其中可以包含常规字母数字字符和特殊字符。以下是一些示例:

名为 ab.txt 的文件(无特殊字符)

名为 -b.txt 的文件(第一个字符是特殊字符)

名为 %! 的文件。txt(两个字符均为特殊字符)

我面临的任务是根据输入文本有效地选择这些文件的子集。当用户输入包含两个字符的字符串时,应用程序必须选择其名称与该字符串对应的所有目录中的所有文件。

我尝试使用带有 glob 的正则表达式模式来直接搜索感兴趣的文件。例如,如果用户输入 ab 作为字符串,我使用函数 like 直接搜索 ab.txt 文件。但是,如果输入字符串包含特殊字符,则此方法不起作用。例如,如果输入字符串为 -b,则无法成功找到 -b.txt 文件。Dir.globDir.glob("data/*/ab.txt")Dir.glob("data/*/-b.txt")

所以我的问题是:我怎样才能有效地根据两个字符的字符串选择文件,即使该字符串包含特殊字符?请注意,由于文件数量众多,涉及将所有文件名读取到内存中的方法效率低下。我正在寻找一种可以立即选择我感兴趣的文件的方法,类似于文件名不包含特殊字符时通配的工作方式。

正则表达式 Ruby 文件 模式匹配 glob

评论

0赞 sln 6/7/2023
文件名是否包含特殊正则表达式字符并不重要,它是目标,而不是正则表达式。很难弄清楚你在做什么。您是否输入了一个字符串以用作正则表达式以匹配文件名?或者你是硬编码正则表达式?即,搜索词是什么意思?你真的想使用正则表达式吗?

答:

1赞 Max 6/8/2023 #1

这就是 Find 擅长的地方:

require 'find'

files = []
pattern = '-b.txt'

Find.find('some/dir') do |path|
  next unless path.end_with? pattern
  files << path
end

运行后,包含(或其任何子目录)内以 .filessome/dir-b.txt

我会避免使用正则表达式、基于 shell 的工具或 glob,因为它们专门使特殊字符难以使用。好处是它为您提供了纯字符串的完整文件路径,您可以将其与纯字符串进行比较,因此根本不涉及特殊的字符处理。Find