匹配子字符串模式后替换URL中的数字

我需要在URL中的某个子字符串模式之后插入一个字符串,并替换之前的任何数字。

/ei/sort.do?layoutCollection=0&layoutCollectionProperty=&layoutCollectionState=0&pagerPage=1 

我需要检测layoutCollectionState=并用我需要的任何数字替换任何数字,这里是“0”。 我读到了String的indexinsert方法,但是他们并没有完全完成我需要他们做的工作。

简单的方法是使用带有正则表达式模式的String#gsub

 s = '/ei/sort.do?layoutCollection=0&layoutCollectionProperty=&layoutCollectionState=0&pagerPage=1' s.gsub(/(?<=layoutCollectionState=)\d+/,'4') #=>"/ei/sort.do?layoutCollection=0&layoutCollectionProperty=&layoutCollectionState=4&pagerPage=1" 

在这里,我将"0"替换为"4" (将"4"更改为您想要使用的任何内容)。

这使用模式后面的模式( (?<=layoutCollectionState=) ),然后捕获该模式后面的数字作为要替换的项目。 然后用第二个参数替换它(在这种情况下为"4"

URL非常复杂,您可以通过使用专为操作它们而不是尝试使用正则表达式创建自己的库来为自己节省大量工作和潜在的麻烦。 幸运的是,Ruby附带了一些,其中包括URI 。 使用它很容易:

 require "uri" str = "/ei/sort.do?layoutCollection=0&layoutCollectionProperty=&layoutCollectionState=0&pagerPage=1" # Create a URI object to easily get the query portion of the string uri = URI(str) # Decode the query values into a Hash query = URI.decode_www_form(uri.query).to_h # Or, if you're using Ruby 2.0 or earlier: # query = Hash[URI.decode_www_form(uri.query)] puts query # => { "layoutCollection" => "0", # "layoutCollectionProperty" => "", # "layoutCollectionState" => "0", # "pagerPage" => "1" # } # Change any values we want to change query["layoutCollectionState"] = "SOME_OTHER_VALUE" # Re-encode the query values and assign them back to the URI object uri.query = URI.encode_www_form(query) # Turn it back into a string puts uri.to_s # => /ei/sort.do?layoutCollection=0&layoutCollectionProperty=& # ... layoutCollectionState=SOME_OTHER_VALUE&pagerPage=1 

为了它的价值,它不必是那么冗长:

 def merge_query_values(url, hsh) URI(url).tap do |uri| uri.query = URI.encode_www_form( URI.decode_www_form(uri.query).to_h.merge!(hsh) ) end.to_s end str = "/ei/sort.do?layoutCollection=0&layoutCollectionProperty=&layoutCollectionState=0&pagerPage=1" puts merge_query_values(str, "layoutCollectionState" => "SOME_OTHER_VALUE", "foo" => "BAR") # => /ei/sort.do?layoutCollection=0&layoutCollectionProperty=& # ... layoutCollectionState=SOME_OTHER_VALUE&pagerPage=1&foo=BAR