2013-09-05 77 views
0

我正在解析來自XML轉儲的維基文本,其中包含一些名爲'section'的字符串,其中包含雙花括號中的模板,包括一些我想要重新組織的參數。在Ruby中用gsub替換掃描:如何在gsub塊中允許代碼?

這有一個例子名爲TextTerm:

section="Sample of a text with a first template {{TextTerm|arg1a|arg2a|arg3a...}} and then a second {{TextTerm|arg1b|arg2b|arg3b...}} etc." 

我可以使用scan和正則表達式使用來獲得每個模板和它的工作在一個循環:

section.scan(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/i).each { |item| puts "1=" + item[1] # arg1a etc.} 

而且,我一直能夠提取模板的第一個參數的數據庫。

現在我還想要替換模板「NewTextTerm」的名稱,並通過將第二個參數放在第一個參數的位置來重新組織它的參數。

我可以在同一個循環中完成嗎?例如,通過由gsub(rgexp){ block}改變scan

section.gsub!(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/) { |item| '{{NewTextTerm|\2|\1}}'} 

我得到:

"Sample of a text with a first template {{NewTextTerm|\\2|\\1}} and then a second {{NewTextTerm|\\2|\\1}} etc." 

這意味着正則表達式的參數無法識別。即使它有效,我想在gsub區塊內有一些位置來處理這些參數。例如,塊中的puts類似於scan().each塊,但不能包含puts塊,但只有一個要替換的字符串。

歡迎任何想法。

PS:一些編輯:大括號和「section = added」,代碼是完整的。

+0

這個評論應該是一個答案,所以它可以適當地upvoted。 – DNNX

+0

你的意思是雙**括號或雙**括號**? – sawa

+0

顯示您的代碼的完整示例,而不是單行。在短循環中處理整個問題可能有更好的方法,但是如果沒有看到你的代碼,我們就不知道你設置了什麼。因此,我們可以建議逐步改進,但我們可能會提出更好的建議。我們還需要查看您正在處理的大量文本樣例:是否重複使用了{{...}}塊,並在整個文件中使用了相同的標記集?編寫模板處理引擎並不難,但我們需要更好的信息。 –

回答

0

當你更換新字符串參數,你可以使用'\1'等這樣的:

string.gsub!(regex, '...\1...\2...') 

當你更換新的模塊,你可以使用"#$1"等這樣的:

string.gsub!(regex){"...#$1...#$2..."} 

您正在混合使用。堅持任何一個。

0

是的,用雙引號改變引用是不夠的,#1是答案。這裏是完整的代碼:

section="Sample of a text with a first template {{TextTerm|arg1a|arg2a|arg3a...}} and then a second {{TextTerm|arg1b|arg2b|arg3b...}} etc." 
section.gsub(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/) { |item| "{{New#$1|#$3|#$2}}"} 
"Sample of a text with a first template {{NewTextTerm|arg2a|arg3a...|arg1a}} and then a second {{NewTextTerm|arg2b|arg3b...|arg1b}} etc." 

因此,它的工作原理。謝謝。

但現在我有一個 「功能」 來替換字符串,返回改變的字符串:

def stringreturn(arg1,arg2,arg3) strr = "{{New"+arg1 + arg3 +arg2 + "}}"; return strr ; end 

section.gsub(/\{\{(TextTerm)\|(.*?)\|(.*?)\}\}/) { |item| stringreturn("#$1","|#$2","|#$3") } 

將返回:

"Sample of a text with a first template {{NewTextTerm|arg2a|arg3a...|arg1a}} and then a second {{NewTextTerm|arg2b|arg3b...|arg1b}} etc." 

感謝所有! 可能有更好的方法來使用Ruby在MediaWiki模板中操作參數。