我的正则表达能力非常差,而且大多数时候他们让我感到愚蠢。有人可以帮忙吗?
这个问题更关心的是如何更好地掌握正则表达式而不是从泥汤中提取信息的工作,所以如果我对mediawiki模板系统的理解有缺陷,我真的不介意那么多。我很快就会发现它。
我正在解析MediaWiki标记,我正在尝试获取MediaWiki模板名称。这些表示为:
{{模板名称|其他内容
或
{{模板名称}}
如果#紧随大括号:
{{#Other thing
我想忽略它。
因此...
我想匹配两个花括号{{后跟#直到下一个出现| (管道)或}}(2关闭curlies)
所以:
{{我是青蛙|其他一些东西 匹配
{{#我是青蛙|其他一些东西 失败
垃圾{{Monkey}} bla bla 匹配
垃圾{{#Monkey}} bla bla 失败
等...
以下正则表达式涵盖了这一点(我认为):
\{{2}(?!\#)(.*?)(?:\||\}\})
但也匹配:
这里的一些东西{{{Giraffe | oijq
如果没有正好两个开口花括号,怎么能让它失败?
编辑:.net regex,btw答案 0 :(得分:2)
您可能想要使用zero-width negative lookbehind/ahead assertion
Lookbehind具有相同的效果,但是 向后工作。它告诉正则表达式 引擎暂时倒退 在字符串中,检查文本是否正确 在lookbehind里面可以匹配 那里。
(?<!a)b
匹配“b” 没有前面的“a”,使用否定 向后看。它不会匹配“cab”,但是 将匹配b(并且只有b) “床”或“债务”。(?<=a)b
(积极的 lookbehind)匹配b(并且只有 b)在驾驶室内,但与床不匹配 或债务。
所以:
(?<!\{)\{{2}?(?!\#)(.*?)(?:\||\}\})
我刚刚注意到的另一个问题是,(.*?)
会与第三个卷曲相匹配...相反,请尝试将第三个卷曲添加到您用于#已
(?<!\{)\{{2}(?!\{*\#|\{+)(.*?)(?:\||\}\})
答案 1 :(得分:0)
(?<!\{)\{{2}(?!\#)(.*?)(?:\||\}\})
零宽度负面后视
(?<!\{)
仅匹配不是大括号之后的位置。
答案 2 :(得分:0)
或许hackish wau基本上会重复使用相同的正则表达式模式,除非使其与3个或更多花括号匹配。可能不是最优雅的解决方案。祝你好运。