我有这样的道路:
我希望:
dir1 =“home”和 dir2 =“xyz”
所以我编写了这个ruby代码来获取输出:
path = "/cygwin/home/learn/xyz"
a = path.split(/\//)
dir1 = a[2]
puts dir1 #home
dir2 = a[4]
puts dir2 #xyz
有没有有效的方法可以做到这一点?
答案 0 :(得分:2)
在处理“/”上的简单拆分无法处理的路径时,有许多边缘情况。例如,/cygwin/home/learn/xyz
和/cygwin/home/learn/xyz/
将以不同方式进行拆分。 /cygwin//home/learn/xyz
也是如此。
你可以考虑一下解决这个问题。
string.split(/\/+/).reject { |p| p.empty? }
但这并不是操纵分裂路径的唯一危险。例如:您在Windows上,并且您将获得包含\
的路径。
相反,使用Pathname进行路径操作。它可以做很多很多事情。 Pathname#each_filename会将所有部分作为数组提供给你。
require "pathname";
# ['cygwin', 'home', 'learn', 'xyz']
puts Pathname.new("/cygwin/home/learn/xyz").each_filename.to_a
尽管使用Pathname的速度要慢3倍,但它更简单,更安全,而Pathname非常有用。文件操作不会成为您的性能瓶颈,在开始优化之前始终进行配置。使用您保存的时间不必编写和调试路径操作代码来进行更重要的优化。
答案 1 :(得分:0)
没有很大的改进空间,但有两个:
_, _, home, _, dir = "/cygwin/home/learn/xyz".split('/')
home
#⇒ "home"
dir
#⇒ "xyz"
当您可以按字符串拆分并且不生成中间数组对象时,请不要使用regexp进行拆分。
此外,人们可能会在这里使用regexp(效率较低,但可能更通用):
m = "/cygwin/home/learn/xyz".match(
%r|\A/\w+/(?<home>\w+)/\w+/(?<dir>\w+)\z|)
m.captures
#⇒ ["home", "xyz"]
m[:home]
#⇒ "home"
m[:dir]
#⇒ "xyz"
答案 2 :(得分:0)
dir1, dir2 = path.split('/').reject{|p| p.empty?}.values_at(1,3)