如何在Ruby中的“{}”之间获取内容?例如,
我喜欢{你}
如何获取“你”元素?如果我想要替换内容,请将“你”更改为“她”,我应该怎么做?可能使用gsub
?
答案 0 :(得分:6)
replacements = {
'you' => 'her',
'angels' => 'demons',
'ice cream' => 'puppies',
}
my_string = "I love {you}.\nYour voice is like {angels} singing.\nI would love to eat {ice cream} with you sometime!"
replacements.each do |source, replacement|
my_string.gsub! "{#{source}}", replacement
end
puts my_string
# => I love her.
# => Your voice is like demons singing.
# => I would love to eat puppies with you sometime!
答案 1 :(得分:4)
从{...}
内部获取内容的简单方法是:
str = 'I love {you}'
str[/{(.+)}/, 1] # => "you"
基本上说,“抓住领先{
内的所有内容到尾随}
。这不是真正的复杂,可以被嵌套的{}
对愚弄。
可以通过多种方式替换目标字符串:
replace_str = 'her'
'I love {you}'.sub('you', replace_str) # => "I love {her}"
一个简单的sub
将用替换文本替换第一次出现的目标字符串。
您可以使用正则表达式而不是字符串:
'I love you {you}'.sub(/you/, replace_str) # => "I love her {you}"
如果目标字符串出现多次,则使用更多文本来定位它。这使用包装分隔符来定位它,然后也替换它们。还有其他方法可以做到这一点,但我会这样做:
'I love you {you}'.sub(/{.+}/, "{#{ replace_str }}") # => "I love you {her}"
亚历克斯·韦恩的回答很接近,但并没有完全解决:Ruby的gsub
有一个非常好的功能,你可以传递一个正则表达式和一个哈希,它将取代所有出现的正则表达式与哈希值中的值匹配:
hash = {
'I' => 'She',
'love' => 'loves',
'you' => 'me'
}
str.gsub(Regexp.union(hash.keys), hash) # => "She loves {me}"
当您想要获取模板并快速替换其中的所有占位符时,这非常强大。
答案 2 :(得分:2)
您可以随时使用.index:
a = 'I love {bill gates}'
a[a.index('{')+1..a.index('}')-1]
最后一行只是在第一次出现'{'之后和第一次出现'}'之前从右边获得'a'。然而,重要的是要注意,这只会在{}的第一次出现之间得到文本。所以它适用于上面的例子。
我也会使用索引来在{} s之间添加新内容。
这看起来像是:
a[0..a.index('{')] + 'Steve Jobs' + a[a.index('}')..-1]
同样,这仅适用于第一次出现'{'和'}'。
Michael G。
答案 3 :(得分:2)
为什么不使用像https://github.com/defunkt/mustache
这样的模板引擎请注意,ruby可以为%{}
执行此操作:
"foo = %{foo}" % { :foo => 'bar' }
#=> "foo = bar"
最后不要忘记查看现有的ruby template engines - 不要重新发明轮子!
答案 4 :(得分:1)
正则表达式是使用gsub的方法。类似的东西:
existingString.gsub(/\{(.*?)\}/) { "her" }