如何用捕获的正则表达式模式替换URL中的字符串

时间:2017-04-07 17:15:18

标签: ruby regex

我想用正则表达式将'hoge'替换为'foo'。但是用户的价值是动态的,所以我不能使用str.gsub('hoge', 'foo')

str = '?user=hoge&tab=fuga'

我该怎么办?

3 个答案:

答案 0 :(得分:3)

请勿使用正则表达式执行此操作。

这是使用现有轮子操纵URI的方法:

require 'uri'

str = 'http://example.com?user=hoge&tab=fuga'
uri = URI.parse(str)
query = URI.decode_www_form(uri.query).to_h # => {"user"=>"hoge", "tab"=>"fuga"}
query['user'] = 'foo'
uri.query = URI.encode_www_form(query)
uri.to_s # => "http://example.com?user=foo&tab=fuga"

可替换地:

require 'addressable'

uri = Addressable::URI.parse('http://example.com?tab=fuga&user=hoge')
query = uri.query_values # => {"tab"=>"fuga", "user"=>"hoge"}
query['user'] = 'foo'
uri.query_values = query
uri.to_s # => "http://example.com?tab=fuga&user=foo"

请注意,在示例中,参数的顺序发生了变化,但代码处理的差异没有问题。

您要使用URIAddressable的原因是因为参数和值在包含非法字符时必须正确编码。 URI和Addressable知道规则并将遵循它们,而天真的代码假设不打扰编码,导致URI损坏。

URI是Ruby标准库的一部分,而Addressable功能更全面。随便挑选。

答案 1 :(得分:2)

您可以尝试以下正则表达式

([?&]user=)([^&]+)

DEMO

答案 2 :(得分:0)

在使用.gsub替换它的任何值之前,您可能想要找出用户查询首先映射到的内容。

首先,使用the URI module将URL字符串解析为URI对象。然后,您可以使用CGI查询方法使用the CGI module从URI对象中获取查询参数的键值对。最后,您可以.gsub关闭该哈希值中的值。