在{}大括号之间获取内容

时间:2012-08-14 00:12:04

标签: ruby

如何在Ruby中的“{}”之间获取内容?例如,

  

我喜欢{你}

如何获取“你”元素?如果我想要替换内容,请将“你”更改为“她”,我应该怎么做?可能使用gsub

5 个答案:

答案 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" }