当其某些键为符号而其他键不是符号时使哈希保持一致

问题描述 投票:1回答:2

我使用此代码将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,如果这段代码有什么问题以及如何改进它,有人可以向我解释吗?

谢谢!

regex ruby hash
2个回答
0
投票

首先,请注意与

1
投票
这意味着'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] }

© www.soinside.com 2019 - 2024. All rights reserved.