1

我正在尝试解析通过 Wikipedia 的 API 接收的 wikitext 文件,问题是它的一些模板(即包含在 {{ 和 }} 中的片段)不会自动扩展为 wikitext,因此我必须在文章中手动查找它们最终获取并替换它们。问题是,我可以在 .NET 中使用正则表达式从文本中获取匹配项吗?

为了让自己更清楚,这里有一个例子来说明我的意思:

对于字符串

{{ abc {{...}} def {{.....}} gh }}

应该有一个匹配,即整个字符串,所以最长可能匹配。

另一方面,对于本例中的“孤立”大括号:

{{ abc {{...}}

结果应该是一个匹配:{{...}}

谁能给我一个建议?提前致谢。

4

4 回答 4

3

您可以使用 .NET 正则表达式使用平衡组定义来做到这一点。

文档中给出的示例显示了它如何与可嵌套<>. 您可以轻松地将分隔符调整为{{}}。如果需要,您可以进一步调整它以允许单个{}“文本”内。

请记住,{and}是正则表达式元字符;要从字面上匹配,您可以转义到\{and \}

于 2010-10-14T11:19:28.743 回答
1

不要使用正则表达式。从左到右遍历字符串,如果遇到 {{ 将其位置推入堆栈,然后在 }} 上从堆栈中弹出前一个 {{ 的位置并计算长度。然后你可以很容易地取这些长度的最大值。

于 2010-10-14T11:14:39.410 回答
0

此正则表达式模式匹配您提到的任意数量的模式。

\{\{(?:[^{]+\{\{[^}]+\}\})+[^}]+\}\}

对于第二个请求,您需要一个不同的正则表达式:

\{\{.*?\}\}
于 2010-10-14T11:22:18.440 回答
0

我认为你在错误的层面上看待这个问题。为什么不直接要求 MediaWiki API 为您扩展模板,而不是 hacky regex 变通方法?您可以传入要扩展的内容:

http://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates

或者,更好的是,要求在下载内容时预先扩展内容中的模板,方法是指定rvexpandtemplates

http://www.mediawiki.org/wiki/API:Query_-_Properties#revisions

于 2010-11-07T23:32:40.340 回答