来自集合的正则表达式的ruby数组

时间:2014-11-19 00:25:42

标签: ruby regex

在我的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] }

2 个答案:

答案 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"]