问题描述
|
这些位于文件夹中:
This_is_a_very_good_movie-y08iPnx_ktA.mp4
myMovie2-lKESbDzUwUg.mp4
his_is_another_movie-lKESbDzUwUg.mp4
如何通过给出最后一部分y08iPnx_ktA
从文件中提取字符串mymovie1
的第一部分?就像是:
get_first_part(\"y08iPnx_kTA\") #=> \"This_is_a_very_good_movie\"
解决方法
将问题分为几部分。方法“ 4”应类似于:
使用目录获取文件列表。
遍历每个文件,然后;
提取\“名称\”(\'This_is_a_very_good_movie \')和\“标签\”(\'y08iPnx_ktA \')。每个文件应使用相同的正则表达式。
如果\“ tag \”与要查找的内容匹配,则返回\“ name \”。
快乐的编码。
在REPL中玩耍,尽情享受:-)
,
def get_first_part(path,suffix)
Dir.entries(path).find do |fname|
File.basename(fname,File.extname(fname)).end_with?(suffix)
end.split(suffix).first
end
@Steve Wilhelm回答的种类有所扩展-除非不使用glob(仅使用文件名时不需要),避免使用Regexp并在File.basename
调用中使用ѭ6so不必包含文件扩展名。还返回字符串\“ This_is_a_very_good_movie \”,而不是文件数组。
如果找不到文件,这当然会提高..在这种情况下,如果找不到匹配项,您只想返回nil
:
def get_first_part(path,suffix)
file = Dir.entries(path).find do |fname|
File.basename(fname,File.extname(fname)).end_with?(suffix)
end
file.split(suffix).first if file
end
, 可以做得比这更清洁吗?根据@Tin Man的建议进行了修订
def get_first_part(path,suffix)
Dir.glob(path + \"*\" + suffix + \"*\").map { |x| File.basename(x).gsub(Regexp.new(\"#{suffix}\\.*$\"),\'\') }
end
puts get_first_part(\"/path/to/files/\",\"-y08iPnx_kTA\")
, 如果文件名只有一个连字符:
path = \'/Users/greg/Desktop/test\'
target = \'rb\'
def get_files(path,target)
Dir.chdir(path) do
return Dir[\"*#{ target }*\"].map{ |f| f.split(\'-\').first }
end
end
puts get_files(path,\'y08iPnx_ktA\')
# >> This_is_a_very_good_movie
如果有多个连字符:
def get_files(path,target)
Dir.chdir(path) do
return Dir[\"*#{ target }*\"].map{ |f| f.split(target).first.chop }
end
end
puts get_files(path,\'y08iPnx_ktA\')
# >> This_is_a_very_good_movie
如果假定代码从包含文件的目录内部运行,则可以删除“ 13”,从而简化为:
puts Dir[\"*#{ target }*\"].map{ |f| f.split(\'-\').first }
# >> This_is_a_very_good_movie
要么
puts Dir[\"*#{ target }*\"].map{ |f| f.split(target).first.chop }
# >> This_is_a_very_good_movie