在我的root / app / models目录中,我有一组符合以下正则表达式模式的文件:
/(.+)_field.rb/
换句话说,一些文件以_field.rb结尾。现在我想将匹配的部分作为数组返回,所以我尝试以下方法:
Dir["#{Rails.root}/app/models/*_field.rb"].select {|file| /(.+)_field.rb/.match(file) }
不幸的是,它只返回整个文件路径,而不仅仅是我需要的部分(例如" abc_field.rb"应该返回" abc")。
我做错了什么?
我能够通过以下方式实现这一目标,但仍在寻找更优雅的东西:
arr = []
Dir["#{Rails.root}/app/models/*_field.rb"].each {|file| arr << /.+\/(.+)_field.rb/.match(file)[1] }
答案 0 :(得分:0)
这个工作:
foo = %w[ a_field.rb b_field.rb]
foo.map{ |f| f[/_field\.rb$/] = ''; f }
# => ["a", "b"]
或:
foo.map{ |f| f.sub(/_field\.rb$/, '') }
# => ["a", "b"]
或:
foo.map{ |f| f[0..-10] }
# => ["a", "b"]
或:
bar = '_field.rb'
foo.map{ |f| f[0..-(bar.size + 1)] }
# => ["a", "b"]
如果您有“path / to / file.ext”,则可以使用File.basename
去除路径部分:
foo = %w[ /path/to/a_field.rb /path/to/b_field.rb]
foo.map{ |p| File.basename(p) }
# => ["a_field.rb", "b_field.rb"]
如果您有基本名称并想要剥离其扩展程序,请使用File.extname
:
foo = %w[ /path/to/a_field.rb /path/to/b_field.rb]
bar = foo.map{ |p|
ext = File.extname(p)
File.basename(p, ext)
}
bar # => ["a_field", "b_field"]
将所有这些结合起来,你就可以免费回家了。
答案 1 :(得分:0)
这应该有效:
arr = Dir["#{Rails.root}/app/models/*_field.rb"]
arr.map { |f| f[/[^\/]+$/] }
在我的电脑上:
arr = Dir["desktop/ruby_src/d*.rb"]
#=> ["desktop/ruby_src/dp.rb", "desktop/ruby_src/dp134.rb"]
arr.map { |f| f[/[^\/]+$/] }
#=> ["dp.rb", "dp134.rb"]