如何在 Ruby 中获取“{}”之间的内容?例如,
我爱你}
我怎样才能获取元素“你”?如果我想替换内容,说将“你”改为“她”,我该怎么做?大概使用gsub
?
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!
从内部获取内容的简单方法{...}
是:
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}"
当您想要获取模板并快速替换其中的所有占位符时,这真的很强大。
您始终可以使用 .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。
为什么不使用一些模板引擎,例如:https ://github.com/defunkt/mustache
请注意,红宝石可以做到这一点%{}
:
"foo = %{foo}" % { :foo => 'bar' }
#=> "foo = bar"
最后不要忘记检查现有的ruby 模板引擎- 不要重新发明轮子!
正则表达式是使用 gsub 的方式。就像是:
existingString.gsub(/\{(.*?)\}/) { "her" }