2012-08-14 94 views
1

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

我爱你{}

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

回答

1

正则表达式是用gsub去的方法。喜欢的东西:

existingString.gsub(/\{(.*?)\}/) { "her" } 
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.

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! 
+0

这是唯一的通用解决方案。 +1! – Linuxios 2012-08-14 00:31:03

2

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

注意,红宝石能为%{}做到这一点:

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

,最后不要忘记检查现有的ruby template engines - 不要重新发明轮子!

+0

OP想要获取花括号之间的内容并可以选择更改它。这与OP的问题中的模板有什么关系? – 2012-08-14 03:00:00

+0

称它为你想要的但是这是一个模板=> http://en.wikipedia.org/wiki/Template – mpapis 2012-08-14 05:01:42

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

当你想采取一个模板,并迅速取代所有的占位符吗?那真的很强大。