Ruby 有没有一种方法可以为一个子字符串命令组合多个正则表达式?
有没有一种方法可以结合使用这两个正则表达式将多平台文件路径转换为URLRuby 有没有一种方法可以为一个子字符串命令组合多个正则表达式?,ruby,regex,ruby-on-rails-3,Ruby,Regex,Ruby On Rails 3,有没有一种方法可以结合使用这两个正则表达式将多平台文件路径转换为URL @image_file = "#{request.protocol}#{request.host}/#{@image_file.path.sub(/^([a-z]):\//,"")}".sub(/^\//,"") 这将处理my Windows和*IX平台上的文件路径转换为URL。例如,以下两个文件路径字符串都被正确处理: - "c:\users\docs\pictures\image.jpg" goes to "http
@image_file = "#{request.protocol}#{request.host}/#{@image_file.path.sub(/^([a-z]):\//,"")}".sub(/^\//,"")
这将处理my Windows和*IX平台上的文件路径转换为URL。例如,以下两个文件路径字符串都被正确处理:
- "c:\users\docs\pictures\image.jpg" goes to "http://localhost/users/docs/pictures/image.jpg"
- "\home\usr_name\pictures\image.jpg" goes to "http://localhost/usr_name/pictures/image.jpg"
如果有一种方法可以将它们正确地组合起来,我不希望对一个字符串使用两个sub
调用
欢迎社会各界提出建议和反馈 您要查找的正则表达式是
/^([a-z]:)?\/
:
"c:/users/docs/pictures/image.jpg".sub(/^([a-z]:)?\//, '')
=> "users/docs/pictures/image.jpg"
"/home/usr_name/pictures/image.jpg".sub(/^([a-z]:)?\//, '')
=> "home/usr_name/pictures/image.jpg"
作为使用文件名和URL的一些背景 首先,Ruby不要求您在Windows文件名中使用反斜杠,所以如果您正在生成它们,就不用麻烦了。相反,依赖于这样一个事实:IO类知道你在什么操作系统上,并且会自动检测路径分隔符,并在运行中为你转换内容。这是来自: 如果可能,Ruby将在不同的操作系统约定之间转换路径名。例如,在Windows系统上,文件名“/gumby/ruby/test.rb”将作为“\gumby\ruby\test.rb”打开。在Ruby字符串中指定Windows样式的文件名时,请记住转义反斜杠:
"c:\\gumby\\ruby\\test.rb"
我们这里的示例将使用Unix风格的前斜杠;File::ALT_分隔符可用于获取平台特定的分隔符字符
如果您从另一个源接收路径,则可以很容易地将它们规范化为Ruby喜欢的内容:
path = "c:\\users\\docs\\pictures\\image.jpg" # => "c:\\users\\docs\\pictures\\image.jpg"
puts path
# >> c:\users\docs\pictures\image.jpg
path.gsub!(/\\/, '/') if path['\\']
path # => "c:/users/docs/pictures/image.jpg"
puts path
# >> c:/users/docs/pictures/image.jpg
为方便起见,编写一个小助手方法:
def normalize_path(p)
p.gsub(/\\/, '/')
end
normalize_path("c:\\users\\docs\\pictures\\image.jpg") # => "c:/users/docs/pictures/image.jpg"
normalize_path("/users/docs/pictures/image.jpg") # => "/users/docs/pictures/image.jpg"
Ruby和类在处理路径时非常有用:
foo = normalize_path(path) # => "c:/users/docs/pictures/image.jpg"
File.dirname(foo) # => "c:/users/docs/pictures"
File.basename(foo) # => "image.jpg"
以及:
另外还有Pathname类:
require 'pathname'
bar = Pathname.new(foo)
bar.dirname # => #<Pathname:c:/users/docs/pictures>
bar.basename # => #<Pathname:image.jpg>
当前显示的
sub
不会像示例所示将反斜杠转换为正斜杠。但最简单的方法是将两个sub串联起来:.sub(/^([a-z]:)?/i,”).gsub(/\/,“/”)
。sub
消除驱动器号,而gsub
转换斜杠。mrbratch,您认为sub没有转换反斜杠是正确的。。。我用交互式Ruby测试了你说的话。谢谢我在Windows上,还没有抽出时间在我正在运行的Linux变体上测试它。我很感谢你的反馈,这很有效!谢谢你。我知道有一个更简单的方法。我对regex的想法太多了。
require 'pathname'
bar = Pathname.new(foo)
bar.dirname # => #<Pathname:c:/users/docs/pictures>
bar.basename # => #<Pathname:image.jpg>
require 'uri'
url = URI::HTTP.build({:host => 'www.foo.com', :path => foo[/^(?:[a-z]:)?(.+)/, 1]})
url # => #<URI::HTTP:0x007fe91117a438 URL:http://www.foo.com/users/docs/pictures/image.jpg>
url.to_s # => "http://www.foo.com/users/docs/pictures/image.jpg"