你怎么解析这个字符串?

时间:2015-09-25 19:57:12

标签: ruby string

/events/3122671255551936/?ref=br_rs&action_history=null

我想在'/ events /'之后和'/?ref = br_rs之前提取数字... \

4 个答案:

答案 0 :(得分:1)

您可以按/字符拆分:

irb(main):003:0> "/events/3122671255551936/?ref=br_rs&action_history=null".split("/")[2]
=> "3122671255551936"

答案 1 :(得分:0)

您还可以使用String#scan方法获取数字:

"/events/3122671255551936/?ref=br_rs&action_history=null".scan(/\d+/).join
 # => "3122671255551936"

答案 2 :(得分:0)

如果您的字符串为str

x = str["/events/".size..-1].to_i
  #=> 3122671255551936

如果你想要字符串:

 x.to_s
   #=> "3122671255551936" 

答案 3 :(得分:0)

您正在查看来自网址的路径。基本的split最初会起作用:

str = '/events/3122671255551936/?ref=br_rs&action_history=null'
str.split('/')[2] # => "3122671255551936"

现有的工具可以轻松实现这一点,并且可以在处理URL时处理特殊字符的编码和解码:

require 'uri'

str = '/events/3122671255551936/?ref=br_rs&action_history=null'
scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI.split(str)
scheme   # => nil
userinfo # => nil
host     # => nil
port     # => nil
registry # => nil
path     # => "/events/3122671255551936/"
opaque   # => nil
query    # => "ref=br_rs&action_history=null"
fragment # => nil

uri = URI.parse(str)

path访问网址的路径组件:

uri.path # => "/events/3122671255551936/"

轻松获取价值:

uri.path.split('/')[2] # => "3122671255551936"

现在,想象一下,如果该网址有一个方案,并且像“http://www.example.com/”这样的主机具有前缀,就像大多数网址一样。 (已经写了数百个蜘蛛和刮刀,我知道遇到这样的变化是多么容易。)使用天真的split('/')会立即破坏:

str = 'http://www.example.com/events/3122671255551936/?ref=br_rs&action_history=null'
str.split('/')[2] # => "www.example.com"

这意味着任何依赖于split的解决方案都会破坏,以及任何其他尝试根据整个字符串找到值的位置的解决方案。

但是使用为工作设计的工具,代码将继续工作:

uri = URI.parse(str)
uri.path.split('/')[2] # => "3122671255551936"

请注意它是多么简单易读,它将转移到更容易维护。它甚至可以简化为:

URI.parse(str).path.split('/')[2] # => "3122671255551936"

并继续工作。

这是因为URL / URI是商定的标准,因此可以编写解析器来拆分和构建符合标准的字符串。

有关详细信息,请参阅URI文档。