用最后一个"/"拆分字符串并捕获split的两个部分 - Ruby

dod*_*747 0 ruby regex string split ruby-on-rails

我有以下ruby代码,它按每个分割一个字符串'/',将每个分割分配给一个变量,在最后一个'/'之后立即插入另一个字符串,然后在将它们分配给变量时重新加入所有这些字符串.

    object = "uploads/video/screenshot/74/DGSCFUA_video.jpg"
    up, vid, pic, num, file = object.split('/')
    file = "#{up}/#{vid}/#{pic}/#{num}/#{file.insert(0, "mini_")}"
    p file

    >> "uploads/video/screenshot/74/mini_DGSCFUA_video.jpg"
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但感觉我错过了一个技巧,这不是最有效的做事方式.

是否可以在最后分割一个字符串'/',(i.e. object.split('/')[-1])但是捕获分割的两个部分而不仅仅是后面的字符'/'

the*_*Man 5

您正在按摩文件路径,因此请使用为该任务制作的工具:

path_to_file = "uploads/video/screenshot/74/DGSCFUA_video.jpg"

file_path, file_name = File.split(path_to_file) 
# => ["uploads/video/screenshot/74", "DGSCFUA_video.jpg"]
Run Code Online (Sandbox Code Playgroud)

或者,您可以这样拆分:

file_path, file_name = File.dirname(path_to_file), File.basename(path_to_file) 
# => ["uploads/video/screenshot/74", "DGSCFUA_video.jpg"]
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法构建新路径:

path_to_file = File.join(file_path, "mini_#{ file_name }") 
# => "uploads/video/screenshot/74/mini_DGSCFUA_video.jpg"
Run Code Online (Sandbox Code Playgroud)

优点是,Ruby的IO类是File的祖先,它在确定路径分隔符时会考虑操作系统,因此如果代码在Windows或*nix上运行,它将做正确的事情.

如果可能,Ruby将在不同的操作系统约定之间转换路径名.例如,在Windows系统上,文件名"/gumby/ruby/test.rb"将打开为"\ gumby\ruby​​\test.rb".在Ruby字符串中指定Windows样式的文件名时,请记住转义反斜杠:

"c:\\gumby\\ruby\\test.rb"
Run Code Online (Sandbox Code Playgroud)