在红宝石中正则表达

时间:2014-10-20 12:18:27

标签: ruby regex

我有一个如下的网址。

/shows/the-ruby-book/meta-programming/?play=5b35a825-d372-4375-b2f0-f641a38067db"

我需要使用正则表达式仅提取播放的ID(即5b35a825-d372-4375-b2f0-f641a38067db)。我该怎么办?

4 个答案:

答案 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会将这些值解码回原始值。