Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何根据哪个正则表达式匹配查找键/符号?_Ruby_Regex_Hash - Fatal编程技术网

Ruby 如何根据哪个正则表达式匹配查找键/符号?

Ruby 如何根据哪个正则表达式匹配查找键/符号?,ruby,regex,hash,Ruby,Regex,Hash,我正在使用RubyZip从Ruby中的zip归档文件中提取文件,我需要根据文件名的特征标记文件: 例如: 我有以下散列: labels = { :data_file=>/.\.dat/i, :metadata=>/.\.xml/i, :text_location=>/.\.txt/i } 我有zip中每个文件的文件名,比如 filename = 382582941917841df.xml 假设每个文件只匹配标签散列中的一个正则表达式,如果不匹配,则选择

我正在使用RubyZip从Ruby中的zip归档文件中提取文件,我需要根据文件名的特征标记文件:

例如: 我有以下散列:

labels = {
   :data_file=>/.\.dat/i, 
   :metadata=>/.\.xml/i,
   :text_location=>/.\.txt/i
 }
我有zip中每个文件的文件名,比如

filename = 382582941917841df.xml
假设每个文件只匹配
标签
散列中的一个正则表达式,如果不匹配,则选择第一个匹配。(在本例中,正则表达式都用于检测扩展名,但也可以检测任何文件名掩码,例如DSC****.jpg)

我现在正在这样做:

label_match =~ labels.find {|key,value| filename =~ value}

---> label_match = [:metadata, /.\.xml/]

label_sym = label_match.nil? ? nil: label_match.first 

这是很好的,但是看起来不是很像Ruby。我有没有什么东西需要很好的清理?

< P>而不是使用<代码> NIL<代码>来在没有匹配的情况下显示标签,考虑使用另一个符号,如<代码>:未知< /C> > 然后你可以做:

labels = {
  :data_file=>/.\.dat/i, 
  :metadata=>/.\.xml/i,
  :text_location=>/.\.txt/i,
  :unknown=>/.*/
}
label = labels.find {|key,value| filename =~ value}.first

而不是使用<代码> nIL/COD>在没有匹配时指示标签,考虑使用另一个符号,如<代码>:未知< /代码> .< 然后你可以做:

labels = {
  :data_file=>/.\.dat/i, 
  :metadata=>/.\.xml/i,
  :text_location=>/.\.txt/i,
  :unknown=>/.*/
}
label = labels.find {|key,value| filename =~ value}.first

而不是使用<代码> nIL/COD>在没有匹配时指示标签,考虑使用另一个符号,如<代码>:未知< /代码> .< 然后你可以做:

labels = {
  :data_file=>/.\.dat/i, 
  :metadata=>/.\.xml/i,
  :text_location=>/.\.txt/i,
  :unknown=>/.*/
}
label = labels.find {|key,value| filename =~ value}.first

而不是使用<代码> nIL/COD>在没有匹配时指示标签,考虑使用另一个符号,如<代码>:未知< /代码> .< 然后你可以做:

labels = {
  :data_file=>/.\.dat/i, 
  :metadata=>/.\.xml/i,
  :text_location=>/.\.txt/i,
  :unknown=>/.*/
}
label = labels.find {|key,value| filename =~ value}.first

我认为这是一种逆向的、艰难的做法。Ruby可以很容易地获得文件的扩展名,这样就可以很容易地将文件映射到某个地方

从以下内容开始:

FILENAMES = %w[ foo.bar foo.baz 382582941917841df.xml DSC****.jpg]

FILETYPES = {
  '.bar' => 'bar',
  '.baz' => 'baz',
  '.xml' => 'metadata',
  '.dat' => 'data',
  '.jpg' => 'image'
}

FILENAMES.each do |fn|
  puts "#{ fn } is a #{ FILETYPES[File.extname(fn)] } file"
end
# >> foo.bar is a bar file
# >> foo.baz is a baz file
# >> 382582941917841df.xml is a metadata file
# >> DSC****.jpg is a image file
该类包含许多类似的方法,用于查找操作系统已知文件的相关信息和/或拆分文件路径和文件名,因此非常熟悉它是一件非常好的事情

同样重要的是理解一个写得不正确的ReXEP,比如<代码> /.dAT/i可能是很多痛苦的根源。
'foo.xml.dat'[/.\.dat/] # => "l.dat"
'foo.database.20010101.csv'[/.\.dat/] # => "o.dat"
  • 这些文件真的是“数据”文件吗
  • 为什么分隔符前面的字符是重要的或必要的
  • 当方法(如
    extname
    更快、维护更少时,您真的想使用未编排的regexp模式降低代码的速度吗

当编写代码时,要考虑这些问题。

< P>我认为你是在向后和困难地做这件事。露比很容易得到一个文件的扩展,这样就可以很容易地把它映射到某个东西。

从以下内容开始:

FILENAMES = %w[ foo.bar foo.baz 382582941917841df.xml DSC****.jpg]

FILETYPES = {
  '.bar' => 'bar',
  '.baz' => 'baz',
  '.xml' => 'metadata',
  '.dat' => 'data',
  '.jpg' => 'image'
}

FILENAMES.each do |fn|
  puts "#{ fn } is a #{ FILETYPES[File.extname(fn)] } file"
end
# >> foo.bar is a bar file
# >> foo.baz is a baz file
# >> 382582941917841df.xml is a metadata file
# >> DSC****.jpg is a image file
该类包含许多类似的方法,用于查找操作系统已知文件的相关信息和/或拆分文件路径和文件名,因此非常熟悉它是一件非常好的事情

同样重要的是理解一个写得不正确的ReXEP,比如<代码> /.dAT/i可能是很多痛苦的根源。
'foo.xml.dat'[/.\.dat/] # => "l.dat"
'foo.database.20010101.csv'[/.\.dat/] # => "o.dat"
  • 这些文件真的是“数据”文件吗
  • 为什么分隔符前面的字符是重要的或必要的
  • 当方法(如
    extname
    更快、维护更少时,您真的想使用未编排的regexp模式降低代码的速度吗

当编写代码时,要考虑这些问题。

< P>我认为你是在向后和困难地做这件事。露比很容易得到一个文件的扩展,这样就可以很容易地把它映射到某个东西。

从以下内容开始:

FILENAMES = %w[ foo.bar foo.baz 382582941917841df.xml DSC****.jpg]

FILETYPES = {
  '.bar' => 'bar',
  '.baz' => 'baz',
  '.xml' => 'metadata',
  '.dat' => 'data',
  '.jpg' => 'image'
}

FILENAMES.each do |fn|
  puts "#{ fn } is a #{ FILETYPES[File.extname(fn)] } file"
end
# >> foo.bar is a bar file
# >> foo.baz is a baz file
# >> 382582941917841df.xml is a metadata file
# >> DSC****.jpg is a image file
该类包含许多类似的方法,用于查找操作系统已知文件的相关信息和/或拆分文件路径和文件名,因此非常熟悉它是一件非常好的事情

同样重要的是理解一个写得不正确的ReXEP,比如<代码> /.dAT/i可能是很多痛苦的根源。
'foo.xml.dat'[/.\.dat/] # => "l.dat"
'foo.database.20010101.csv'[/.\.dat/] # => "o.dat"
  • 这些文件真的是“数据”文件吗
  • 为什么分隔符前面的字符是重要的或必要的
  • 当方法(如
    extname
    更快、维护更少时,您真的想使用未编排的regexp模式降低代码的速度吗

当编写代码时,要考虑这些问题。

< P>我认为你是在向后和困难地做这件事。露比很容易得到一个文件的扩展,这样就可以很容易地把它映射到某个东西。

从以下内容开始:

FILENAMES = %w[ foo.bar foo.baz 382582941917841df.xml DSC****.jpg]

FILETYPES = {
  '.bar' => 'bar',
  '.baz' => 'baz',
  '.xml' => 'metadata',
  '.dat' => 'data',
  '.jpg' => 'image'
}

FILENAMES.each do |fn|
  puts "#{ fn } is a #{ FILETYPES[File.extname(fn)] } file"
end
# >> foo.bar is a bar file
# >> foo.baz is a baz file
# >> 382582941917841df.xml is a metadata file
# >> DSC****.jpg is a image file
该类包含许多类似的方法,用于查找操作系统已知文件的相关信息和/或拆分文件路径和文件名,因此非常熟悉它是一件非常好的事情

同样重要的是理解一个写得不正确的ReXEP,比如<代码> /.dAT/i可能是很多痛苦的根源。
'foo.xml.dat'[/.\.dat/] # => "l.dat"
'foo.database.20010101.csv'[/.\.dat/] # => "o.dat"
  • 这些文件真的是“数据”文件吗
  • 为什么分隔符前面的字符是重要的或必要的
  • 当方法(如
    extname
    更快、维护更少时,您真的想使用未编排的regexp模式降低代码的速度吗

编写代码时要考虑的事项。

< P> A<代码> < < /C> >时,不费吹灰之力:

filename = "382582941917841df.xml"

category = case filename 
  when /.\.dat/i ; :data_file
  when /.\.xml/i ; :metadata
  when /.\.txt/i ; :text_location
end

p category # => :metadata ; nil if nothing matched

当毫不费力地做到这一点时,
情况:

filename = "382582941917841df.xml"

category = case filename 
  when /.\.dat/i ; :data_file
  when /.\.xml/i ; :metadata
  when /.\.txt/i ; :text_location
end

p category # => :metadata ; nil if nothing matched

毫不费力地做到这一点时,
情况:

filename = "382582941917841df.xml"

category = case filename 
  when /.\.dat/i ; :data_file
  when /.\.xml/i ; :metadata
  when /.\.txt/i ; :text_location
end

p category # => :metadata ; nil if nothing matched

毫不费力地做到这一点时,
情况:

filename = "382582941917841df.xml"

category = case filename 
  when /.\.dat/i ; :data_file
  when /.\.xml/i ; :metadata
  when /.\.txt/i ; :text_location
end

p category # => :metadata ; nil if nothing matched

我的印象是Ruby中的哈希不能保证有一个顺序,所以这肯定会导致一个已知文件被归类为未知文件?而且,我仍然需要拒绝未知文件files@JohnLinux从版本1.9开始,哈希保持插入顺序。如上所述,哈希确实保持插入顺序,因此这将起作用很好。您如何处理
:未知的
文件当然取决于您。假设您的拒绝过程是检查
nil
,只需检查
u即可