1

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

我爱你}

我怎样才能获取元素“你”?如果我想替换内容,说将“你”改为“她”,我该怎么做?大概使用gsub

4

5 回答 5

5
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!
于 2012-08-14T00:24:31.577 回答
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}"

亚历克斯韦恩的回答很接近但并没有一路走下去:Rubygsub有一个非常好的功能,您可以在其中向它传递一个正则表达式和一个哈希,它会将所有出现的正则表达式匹配替换为哈希中的值:

hash = {
  'I' => 'She',
  'love' => 'loves',
  'you' => 'me'
}
str.gsub(Regexp.union(hash.keys), hash) # => "She loves {me}"

当您想要获取模板并快速替换其中的所有占位符时,这真的很强大。

于 2012-08-14T03:08:11.857 回答
2

您始终可以使用 .index:

a = 'I love {bill gates}'
a[a.index('{')+1..a.index('}')-1]

最后一行只是说从第一次出现'{'之后和第一次出现'}'之前获取'a'。然而,重要的是要注意,这只会获取第一次出现 {} 之间的文本。所以它适用于你上面的例子。

我还会使用索引在 {} 之间添加一些新内容。

这看起来像:

a[0..a.index('{')] + 'Steve Jobs' + a[a.index('}')..-1]

同样,这只适用于第一次出现的“{”和“}”。

迈克尔·G。

于 2012-08-14T00:21:02.527 回答
2

为什么不使用一些模板引擎,例如:https ://github.com/defunkt/mustache

请注意,红宝石可以做到这一点%{}

"foo = %{foo}" % { :foo => 'bar' }
#=> "foo = bar"

最后不要忘记检查现有的ruby​​ 模板引擎- 不要重新发明轮子!

于 2012-08-14T00:38:43.860 回答
1

正则表达式是使用 gsub 的方式。就像是:

existingString.gsub(/\{(.*?)\}/) { "her" }
于 2012-08-14T00:17:37.990 回答