正则表达式捕获太多

问题描述 投票:0回答:1

我需要为 Wikipedia 上的 AutoWikiBrowser 机器人创建 .NET 正则表达式,但遇到问题。

这个例子相当长,但我需要一个更长的正则表达式来查找最多 14 个语言指示模板(双大括号内有 2-3 个字母,例如

{{ab}}
)并将它们合并到单个模板中(例如
{{ab}} {{cd}} {{ef}} {{gh}}
= >
{{mul|ab|cd|ef|gh}}

这是我的正则表达式:

查找:

\{\{ *(ab|cd|ef|gh) *\}\} *\{\{ *(ab|cd|ef|gh) *\}\} *(\{\{ *(ab|cd|ef|gh) *\}\})* *(\{\{ *(ab|cd|ef|gh) *\}\})* *(\{\{ *(ab|cd|ef|gh) *\}\})* *(\{\{ *(ab|cd|ef|gh) *\}\})*

更换:

{{mul|$1|$2|$4|$6|$8|$10}} 

它实际上按预期工作,除非模板没有用空格分隔,否则最后一个模板将无法正确捕获。您可以在此处查看测试字符串第一行的问题:https://regex101.com/r/nMUg0J/2

我想我应该使用lookaround,但我什至找不到问题出在哪里。

请注意,如果没有足够的模板进行标记,此正则表达式将创建带有无用管道的模板,但我将在第一个正则表达式之后使用其他正则表达式来删除它们:https://regex101.com/r/MuIiWS/ 1

regex regex-lookarounds wikipedia
1个回答
0
投票

这几乎可以肯定通过使用具有单个正则表达式的替换函数更容易实现,但如果您仅限于正则表达式,可能更简单的解决方案是首先用

}}{{
替换模板之间的
|
,然后添加
mul|
位于任何多语言模板的开头。首先,替换:

(?<=ab|cd|ef|gh) *}} *{{ *(?=ab|cd|ef|gh)

|
regex101上的演示),然后替换

(?<={{)(?=(ab|cd|ef|gh)\|)

mul|
regex101上的演示)

© www.soinside.com 2019 - 2024. All rights reserved.