0

我正在从 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=添加”,代码是完整的。

4

2 回答 2

0

当您将替换作为字符串参数时,您可以'\1'像这样使用等:

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

当您将替换作为一个块时,您可以"#$1"像这样使用等:

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

您正在混合用途。坚持任何一个。

于 2013-09-05T15:33:25.033 回答
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 模板中操作参数可能有更好的方法。

于 2013-09-09T08:36:03.653 回答