我有一个如下的网址。
/shows/the-ruby-book/meta-programming/?play=5b35a825-d372-4375-b2f0-f641a38067db"
我需要使用正则表达式仅提取播放的ID(即5b35a825-d372-4375-b2f0-f641a38067db
)。我该怎么办?
答案 0 :(得分:4)
我不会使用正则表达式来解析网址。我会使用Ruby的库来处理URL:
require 'uri'
url = '/shows/the-ruby-book/meta-programming/?play=5b35a825-d372-4375-b2f0-f641a38067db'
uri = URI.parse(url)
params = URI::decode_www_form(uri.query).to_h
params['play']
# => 5b35a825-d372-4375-b2f0-f641a38067db
答案 1 :(得分:1)
你可以这样做:
str = '/shows/the-ruby-book/meta-programming/?play=5b35a825-d372-4375-b2f0-f641a38067db'
match = str.match(/.*\?play=([^&]+)/)
puts match[1]
=> "5b35a825-d372-4375-b2f0-f641a38067db"
正则表达式/.*\?play=([^&]+)/
将匹配所有内容直到?play=
,然后捕获任何不是&
的内容(查询字符串参数分隔符)
匹配将创建一个MatchData
对象,此处由match
变量表示,捕获将是对象的索引,因此您的匹配数据可在match[1]
处获得。
答案 2 :(得分:1)
url = '/shows/the-ruby-book/meta-programming/?play=5b35a825-d372-4375-b2f0-f641a38067db'
url.split("play=")[1] #=> "5b35a825-d372-4375-b2f0-f641a38067db"
答案 3 :(得分:0)
Ruby的内置URI类具有正确解析,拆分和解码URL所需的一切:
require 'uri'
uri = URI.parse('/shows/the-ruby-book/meta-programming/?play=5b35a825-d372-4375-b2f0-f641a38067db')
URI::decode_www_form(uri.query).to_h['play'] # => "5b35a825-d372-4375-b2f0-f641a38067db"
如果您使用的是不支持to_h
的较旧的Ruby,请使用:
Hash[URI::decode_www_form(uri.query)]['play'] # => "5b35a825-d372-4375-b2f0-f641a38067db"
您应该使用URI,而不是尝试使用正则表达式进行拆分/提取,因为如果任何值不在规范允许的字符范围内,URI的查询将被编码。 URI或Addressable::URI会将这些值解码回原始值。