4

我想转换字符串:

"{john:123456}" 

至:

"<script src='https://gist.github.com/john/123456.js'>"

我写了一个可行的方法,但它非常愚蠢。它是这样的:

def convert
    args = []

    self.scan(/{([a-zA-Z0-9\-_]+):(\d+)}/) {|x| args << x}  

    args.each do |pair|
       name = pair[0]
       id = pair[1]
       self.gsub!("{" + name + ":" + id + "}", "<script src='https://gist.github.com/#{name}/#{id}.js'></script>")
    end 

    self
end

有没有办法像cool_method下面那样做到这一点?

"{john:123}".cool_method(/{([a-zA-Z0-9\-_]+):(\d+)}/, "<script src='https://gist.github.com/$1/$2.js'></script>")
4

4 回答 4

7

那个很酷的方法是 gsub。你离得太近了!只需将 $1 和 $2 更改为 \\1 和 \\2

http://ruby-doc.org/core-2.0/String.html#method-i-gsub

"{john:123}".gsub(/{([a-zA-Z0-9\-_]+):(\d+)}/, 
  "<script src='https://gist.github.com/\\1/\\2.js'></script>")
于 2013-05-06T13:44:38.177 回答
1

这看起来像一个 JSON 字符串,因此,正如@DaveNewton 所说,将其视为一个:

require 'json'
json = '{"john":123456}' 
name, value = JSON[json].flatten
"<script src='https://gist.github.com/#{ name }/#{ value }.js'></script>"
=> "<script src='https://gist.github.com/john/123456.js'></script>"

为什么不将其视为字符串并在其上使用正则表达式?因为 JSON 不是通过正则表达式解析的简单格式,当值更改或数据字符串变得更复杂时,这可能会导致错误。

于 2013-05-06T15:52:05.887 回答
1
s = "{john:123456}".scan(/\w+|\d+/).each_with_object("<script src='https://gist.github.com") do |i,ob|
  ob<< "/" + i
end.concat(".js'>")
p s #=> "<script src='https://gist.github.com/john/123456.js'>"
于 2013-05-06T13:46:51.807 回答
1

我会做

def convert
    /{(?<name>[a-zA-Z0-9\-_]+):(?<id>\d+)}/ =~ self
    "<script src='https://gist.github.com/#{name}/#{id}.js'></script>"
end

有关详细信息,请参阅http://ruby-doc.org/core-2.0/Regexp.html#label-Capturing 。

于 2013-05-06T13:42:46.023 回答