我正在从 XML 转储中解析 Wiki 文本,以获取名为“section”的字符串,该字符串包含双括号中的模板,包括一些我想重新组织的参数。
这有一个名为 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”的名称,并通过将第二个参数代替第一个来重新组织它的参数。
我可以在同一个循环中做吗?例如通过scan
更改gsub(rgexp){ block}
:
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
在块中包含与gsub
块类似的a,scan().each
而只能替换一个字符串。
欢迎任何想法。
PS:一些编辑:大括号和“section=添加”,代码是完整的。