如何检索由“{{”括起来的子字符串的最长匹配项和“}}”?

发布于 2024-09-27 14:23:10 字数 403 浏览 8 评论 0原文

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

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

对于字符串

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

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

另一方面,对于“孤立”大括号(例如本例中的情况):

{{ abc {{...}}

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

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

I am trying to parse a wikitext file received through Wikipedia's API and the problem is that some of its templates (i.e. snippets enclosed in {{ and }}) are not automatically expanded into wikitext, so I have to manually look for them in the article source and replace them eventually. The question is, can I use regex in .NET to get the matches from the text ?

To try to make myself more clear, here is an example to illustrate what I mean:

For the string

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

there should be a single match, namely the entire string, so the longest possible match.

On the other hand, for "orphaned" braces such as in this example:

{{ abc {{...}}

the result should be a single match: {{...}}

Could anyone offer me a suggestion ?
Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

漆黑的白昼 2024-10-04 14:23:10

您可以通过 .NET 正则表达式使用平衡组定义来执行此操作。

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

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

You can do this with .NET regex using balancing groups definition.

The example given in the documentation shows how it works with nestable < and >. You can easily adapt the delimiters to {{ and }}. You can adapt it further to allow for single { and } within the "text" if you want.

Remember that { and } are regex metacharacters; to match literally, you can escape to \{ and \}.

棒棒糖 2024-10-04 14:23:10

不要用正则表达式来做。从左到右遍历字符串,如果遇到 {{,则将其位置压入堆栈,如果遇到 }},则从堆栈中弹出前一个 {{ 的位置并计算长度。然后你就可以轻松地获取这些长度的最大值。

Don't do it with regex. Go through the string left to right and if you encounter a {{ push its position on a stack, and on a }} pop the position of the previous {{ from the stack and calculate the length. Then you can easily take the maximum of these length.

╭⌒浅淡时光〆 2024-10-04 14:23:10

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

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

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

\{\{.*?\}\}

This regex pattern matches any arbitrary numbers of you mentioned pattern.

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

For the second request, you'll need a different regex:

\{\{.*?\}\}
疧_╮線 2024-10-04 14:23:10

我认为你在错误的层面上看待这个问题。为什么不直接要求 MediaWiki API 为您扩展模板,而不是使用 hacky 正则表达式解决方法呢?您可以传入要扩展的内容:

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

要求内容中的模板在下载时预先展开:

或者,更好的是,通过指定 rvexpandtemplates来 mediawiki.org/wiki/API%3aQuery__Properties#revisions" rel="nofollow">http://www.mediawiki.org/wiki/API:Query__Properties#revisions

I think you're looking at this on the wrong level. Instead of hacky regex workarounds, why not just ask the MediaWiki API to expand templates for you? You can either pass in content to be expanded:

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

Or, better yet, ask templates in content to be pre-expanded as you download them by specifying rvexpandtemplates:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文