我使用此代码将Matchdata与哈希混合:
params = {
:url => 'http://myradiowebsite.com/thestation'
}
pattern = Regexp.new('^https?://(?:www.)?myradiowebsite.com/(?<station_slug>[^/]+)/?$')
matchdatas = pattern.match(params[:url])
#convert named matches in MatchData to Hash
#https://stackoverflow.com/a/11690565/782013
datas = Hash[ matchdatas.names.zip( matchdatas.captures ) ]
params = params.merge(datas)
但是这在我的[[params哈希中给了我混合的键:
{:url =>“ http://myradiowebsite.com/thestation”,“ station_slug” =>“ thestation”}
稍后使用键获取哈希值是一个问题。我想将它们标准化为符号。
我正在学习Ruby,如果这段代码有什么问题以及如何改进它,有人可以向我解释吗?
谢谢!
首先,请注意与
'www'
之后和'com'
之前的时间段需要转义:pattern =
Regexp.new('\Ahttps?://(?:www\.)?myradiowebsite\.com/(?<station_slug>[^/]+)/?\z')
#=> /\Ahttps?:\/\/(?:www\.)?myradiowebsite\.com\/(?<station_slug>[^\/]+)\/?\z/
我还用字符串开头锚点[^
)替换了行首锚点[\A
),并用字符串末尾替换了行尾锚点[$
) -string锚点(\z
),但由于字符串由一行组成,因此可以在其中使用。您
已给定您想要在哈希中返回的两个键::url
和:station_slug
,因此
params = { :url => 'http://myradiowebsite.com/thestation' }
您可以计算
m = params[:url].match(pattern) #=> #<MatchData "http://myradiowebsite.com/thestation" station_slug:"thestation">
然后只要
m
不是nil
(如此处),写{ :url => m[0], :station_slug => m["station_slug"] } #=> {:url=>"http://myradiowebsite.com/thestation", :station_slug=>"thestation"}
((只需两个键,就无需使用Array#zip
。]请参见MatchData#[]。
m[0]
返回整个比赛;m["station_slug"]
返回名为"station_slug"
的捕获组的内容。
显然,捕获组的名称可以是任何有效的字符串,也可以将其设为未命名的捕获组并写入
{ :url => m[0], :station_slug => m[1] }