我正在解析來自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」,代碼是完整的。
這個評論應該是一個答案,所以它可以適當地upvoted。 – DNNX
你的意思是雙**括號或雙**括號**? – sawa
顯示您的代碼的完整示例,而不是單行。在短循環中處理整個問題可能有更好的方法,但是如果沒有看到你的代碼,我們就不知道你設置了什麼。因此,我們可以建議逐步改進,但我們可能會提出更好的建議。我們還需要查看您正在處理的大量文本樣例:是否重複使用了{{...}}塊,並在整個文件中使用了相同的標記集?編寫模板處理引擎並不難,但我們需要更好的信息。 –