正则表达式匹配没有特定命名参数的 MediaWiki 模板

Regex to match MediaWiki template without certain named parameter

我要直截了当:我需要一个正则表达式来匹配列表 中具有 date 参数 的任何模板 - 所以假设我的 (现在是单例)模板列表是“存根”,应该匹配以下粗体的内容:

此外,如果日期参数为空也能匹配就好了,但这不是必需的。

我目前使用的正则表达式是

{{((?:stub|inaccurate)(?!(?:\|.*?\|)*?\|date=.*?(?:\|.*?)*?)(?:\|.*?)*?)}}

但是它匹配上面列表中的第四和第六项。

注意:(?:stub|inaccurate) 只是为了确保模板是 stubinaccurate 模板。

注2:此处regex的风格是Python 2.7 module RE.

我认为有一个否定的前瞻就足够了,它试图在任何位置匹配日期?

{{((?:stub|inaccurate)(?!.*\|date=).*)}}

如果空日期参数在等号后有 |,则使用

{{((?:stub|inaccurate)(?!.*\|date=[^|}]).*)}}

由于您使用的是 Python,因此您可以享受 an actual parser:

import mwparserfromhell
wikicode = mwparserfromhell.parse('{{stub|param|date=a|param}}')
for template in wikicode.filter_templates():
    if template.get('date')...

即使模板包含您意想不到的内容({{stub| date=a}}{{stub|<!--<newline>-->date=a}}{{stub|foo={{bar}}|date=a}} 等),该信息也将保持准确。 classic answer 关于使用正则表达式解析复杂标记的危险也适用于维基文本。