0

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

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

我正在解析 MediaWiki 标记,并且正在尝试获取 MediaWiki 模板名称。这些由以下内容表示:

{{模板名称|其他内容

或者

{{模板名称}}

如果 # 紧跟大括号:

{{#其他事情

我想忽略它。

所以...

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

所以:

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

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

垃圾在这里{{Monkey}}bla bla match

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

ETC...

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

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

但也匹配:

这里有些东西{{{长颈鹿|oijq

如果不完全是 2 个开口花括号,我怎么能让它失败?

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

4

3 回答 3

2

您可能想要使用零宽度的负向后/向前断言

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

所以:

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

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

(?<!\{)\{{2}(?!\{*\#|\{+)(.*?)(?:\||\}\})
于 2009-08-06T00:23:36.163 回答
0
(?<!\{)\{{2}(?!\#)(.*?)(?:\||\}\})

零宽度负后视

(?<!\{)

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

于 2009-08-06T00:22:35.880 回答
0

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

于 2009-08-06T00:24:05.057 回答