【问题标题】:Regex help for MediaWiki template markupMediaWiki 模板标记的正则表达式帮助
【发布时间】:2009-08-06 00:16:09
【问题描述】:

我的正则表达式技能很差,而且大多数时候它们让我觉得自己很愚蠢。有人可以帮忙吗?

这个问题更关心的是更好地掌握正则表达式而不是从泥汤中提取信息的工作,所以如果我对 mediawiki 模板系统的理解有缺陷,我真的不介意。我很快就会发现它。

我正在解析 MediaWiki 标记,并且正在尝试获取 MediaWiki 模板名称。这些用类似的东西表示:

{{模板名称|其他内容

{{模板名称}}

如果 # 紧跟大括号:

{{#其他事情

我想忽略它。

所以...

我想匹配 2 个大括号 {{ 后面不跟 # 直到下一次出现 | (管道)或 }}(2 个结束卷曲)

所以:

{{我是一只青蛙|其他一些东西 匹配

{{#我是一只青蛙|其他一些东西 失败

这里是垃圾{{Monkey}}bla bla 匹配

这里是垃圾{{#Monkey}}bla bla 失败

等等……

以下正则表达式涵盖了这一点(我认为):

\{{2}(?!\#)(.*?)(?:\||\}\})

但也匹配:

这里有一些东西 {{{Giraffe|oijq

如果不完全是 2 个左花括号,我该如何让它失败?

编辑:.net 正则表达式,顺便说一句

【问题讨论】:

  • 您正在做的事情有点像正则表达式的舒适区。你可以做到,但你最终会付出很多努力,以至于你可能想要创建一个轻量级的解析器。这样,当您安装新语法并嵌套它们时,您最终不会陷入困境
  • {{{blah}}} 应该呈现什么或结果是什么?
  • 我知道。正则表达式真的很糟糕,但我需要从文档中获取的信息量非常小,我需要快速处理它们,所以我真的无法解析。

标签: .net regex mediawiki


【解决方案1】:

您可能想使用zero-width negative lookbehind/ahead assertion

Lookbehind 具有相同的效果,但 向后工作。它告诉正则表达式 引擎暂时后退 在字符串中,检查文本是否 在lookbehind里面可以匹配 那里。 (?<!a)b 匹配一个“b”,即 前面没有“a”,使用否定 向后看。它不会匹配“cab”,但是 将匹配 b(并且仅 b)在 “床”或“债务”。 (?<=a)b(正 lookbehind) 匹配 b (并且仅 b) 在驾驶室,但与床不匹配 或债务。

所以:

(?<!\{)\{{2}?(?!\#)(.*?)(?:\||\}\})

我刚刚注意到的另一个问题,(.*?) 将匹配第三个花括号...相反,尝试将第三个花括号添加到您已用于 # 的负前瞻

(?<!\{)\{{2}(?!\{*\#|\{+)(.*?)(?:\||\}\})

【讨论】:

  • 与我对 Dav 的评论相同。好像不行。
  • 更新的答案 - 不确定您是否需要在一组中转义 # 或 {,我认为您不需要。
  • 好的。给你答案,因为你对 (.*?) 匹配第三个大括号是正确的,这让我得到了答案。最后得到以下内容: (?\#|\{+)(.?)(?:\||\}\ })
  • 酷 - 编辑答案以将其作为最后一个示例
【解决方案2】:
(?<!\{)\{{2}(?!\#)(.*?)(?:\||\}\})

零宽度负向回溯

(?<!\{)

仅匹配不直接位于花括号之后的位置。

【讨论】:

    【解决方案3】:

    一个 hackish wau 基本上会重复相同的正则表达式模式执行 OR NOT,除了让它匹配 3 个或更多花括号。可能不是最优雅的解决方案。祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多