想這是我們的文字:
text =
「如果你{決定|擬|願望} {去|要去}到{露營|有戶外休息|釣魚|獵},您{可能喜歡|需要|只需要|可以使用}睡袋[產品名稱]。 {它|這個睡袋} {用於[SEASON]和{設計|縫製] {TYPE] {type | form-factor}是理想的。 {它是| {真的| {並非如此}}}絕對是一個很棒的包。'
注意我在最後一句中添加了一些嵌套的大括號。
首先,獲得替代由哈希規定:
h = { '[PRODUCT NAME]'=>'Hard Wear Mountain',
'[SEASON]'=>'fall',
'[TYPE]'=>'underpaid workers' }
如下:
r =/
\[ # match a left bracket
.+? # match >= 1 characters non-greedily (stop at 1st right bracket)
\] # match right bracket
/x
str = text.gsub(r,h)
返回:
「如果你{決定|計劃|願望} {到到{野營|有戶外休息|釣魚|狩獵},你{可能需要|只需要|可以使用}睡袋Hard Wear Mountain。{It | This sleeping bag} {is intended | is ideal}用於秋天和由...縫製薪酬低的工人{type | form-factor}。 {是| {真| {不是那麼|所有}} |肯定}大袋「
每串s = [...]
由h[s]
如果h
有一個關鍵s
更換;其他無需更換由
現在做的替代品,與內{...|...|...}
開始,然後直到沒有更多的替代品是由外工作:
old = str
loop do
new = old.gsub(/\{[^{]+?(?:\|[^{}]+?)+\}/) do |s|
a = s[1..-2].split('|')
a[rand(a.size)]
end
break if new==old
old=new
end
old
返回:
「如果你決定要到釣魚,你需要睡袋Hard Hard Mountain。這款睡袋適用於秋季,並且由低薪工人縫製。這是一個很好的包「
這裏的想法是做一個替換序列,每次形式爲'{...|...|... }'
的字符串,其中...
的不包含左括號,因此不包含嵌套。block顯示的步驟,下面顯示的順序隨機更換(當然這可能比上面我所不同)
第一輪替換
str # as above
old = str
new = old.gsub(/\{[^{]+?(?:\|[^{}]+?)+\}/) do |s|
a = s[1..-2].split('|')
a[rand(a.size)]
end
new==old #=> false
現在new
等於:
「如果你打算去打獵,你只需要睡袋Hard Hard Mountain。它是秋季和理想的低薪工人類型。 {是| {真|所有} |肯定}大袋「
請注意:所有非嵌套撐塊已經解決,並嵌套塊:
{It is|{really|{not so|all that}}|certainly}
一直由一個在嵌套級別降低:
{It is|{really|all that}|certainly}
爲{not so|all that}
已取代all that
。在此塊隨機替換的話如下:
s0 = '{not so|all that}'
s1 = s0[1..-2]
#=> "not so|all that"
a = s1.split('|')
#=> ["not so", "all that"]
a[rand(a.size)]
#=> a[rand(2)] => a[1] => "all that"
第二輪更新換代
old=new
new = old.gsub(/\{[^{]+?(?:\|[^{}]+?)+\}/) do |s|
a = s[1..-2].split('|')
a[rand(a.size)]
end
new==old #=> false
new
現在等於:
「如果你計劃要去打獵,你只需要睡袋Hard Wear Mountain,適合秋季和低薪工作者製作{這是一款非常棒的包。
第三輪更換
old=new
new = old.gsub(/\{[^{]+?(?:\|[^{}]+?)+\}/) do |s|
a = s[1..-2].split('|')
a[rand(a.size)]
end
new==old #=> false
new
的現在等於:
「如果你計劃要去打獵,你只需要睡袋堅硬耐磨山它是理想的秋季和製造。工資低的工人,肯定是一個偉大的包。「
我們現在完成了,但不會知道,直到我們再試一次,發現new == old #=> true
。
第四輪更新換代
old=new
new = old.gsub(/\{[^{]+?(?:\|[^{}]+?)+\}/) do |s|
a = s[1..-2].split('|')
a[rand(a.size)]
end
new==old #=> true
http://stackoverflow.com/questions/6331065/matching-balanced-parenthesis-in-ruby-using-recursive-regular-expressions-like-p – 2015-04-23 04:42:57
@CarySwoveland完成。 – tchrist