如何使用拆分和扫描来解析ruby中的URI?

时间:2015-09-25 04:30:00

标签: ruby parsing split uri

假设我在Ruby中有这个字符串

str = "/server/ab/file.html

我想获得一个包含

的数组

["/server/", "/ab/", "file.html"]

有没有办法使用拆分或扫描获取此数组?我已经尝试了各种组合,没有完全匹配我想要的东西。我不能使用任何外部库。有任何想法吗?感谢。

3 个答案:

答案 0 :(得分:2)

正如@sawa所述,问题在于双重' /'这需要你操纵字符串。

我能想到的最直接的解决方案是:

foo/

编辑2

跟进@ mudasobwa的概念,想法和输入,如果您知道第一个字符总是# removes the '/' at the beginning of the string # and splits the string to an array a = str.sub(/^\//, '').split('/') # => ["server", "ab", "file.html"] # iterates through the array objects EXCEPT the last one, # (notice three dots '...' instead of two '..'), # and adds the missing '/' a[0...-1].each {|s| s << '/'; s.insert(0 , '/')} # => ["/server/", "/ab/"] a # => ["/server/", "/ab/", "file.html"] ,那么这将是目前为止最快的解决方案(参见编辑基准):

'/'

祝你好运。

<强>基准

阅读@ mudasobwa的回答后,我印象非常深刻。我想知道他的解决方案有多快...

......我很惊讶地看到,尽管他的解决方案看起来更优雅,但它的速度要慢得多。

我不知道为什么,但似乎在这种情况下使用gsub或扫描的Regexp查找速度较慢。

这是基准,对于任何感兴趣的人(每秒迭代次数 - 更高的数字更好):

        a = str[1..-1].split('/')
        a << (a.pop.tap { a.map! {|s| "/#{s}/" } } )

答案 1 :(得分:2)

▶ str.gsub(/(?<=\/)([\w.]+)(\/)?/).map { |m| "#{$2 && '/'}#{m}" } 
#⇒ [ "/server/", "/ab/", "file.html" ]

或者,scan,更具语义性:

▶ str.scan(/(?<=\/)([\w.]+)(\/)?/).map { |(val,slash)| slash ? "/#{val}/" : val }

可能是最快的解决方案:

▶ a = str[1..-1].split('/')
▶ [*a[0..-2].map { |e| "/#{e}/"}, a[-1]]
#⇒ ["/server/", "/ab/", "file.html"]

完成原地阵列更改(嘿,美学):

▶ a = str[1..-1].split('/')
▶ a.pop.tap do |e| 
▷   a.map! do |e| 
▷     [-1, 0].each do |i| 
▷       e.insert(i, '/')
▷     end
▷     e
▷   end.push e
▷ end
▶ puts a
#⇒ ["/server/", "/ab/", "file.html"]

答案 2 :(得分:0)

str = str[1..-1].split('/')
=> ["server", "ab", "file.html"]
str[0...-1].map!{|e| "/#{e}/"} << str[-1]
=> ["/server/", "/ab/", "file.html"]