2012-08-14 93 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}" 

當你想採取一個模板,並迅速取代所有的佔位符嗎?那真的很強大。