用于删除特定维基百科模板中重复值的正则表达式

Regex for removing duplicate values in a specific Wikipedia template

提问人:oli_vi_er 提问时间:11/18/2023 最后编辑:oli_vi_er 更新时间:11/18/2023 访问量:45

问:

我正在尝试使用AutoWikiBrowser机器人(适用于.NET风格)删除带有正则表达式的维基百科模板中的重复值(并且仅在此模板中)。

我想找到并替换为{{mul|fr|en|fr}}{{mul|fr|en}}

\b(\w+)\s*\|\s*(?=.*\1)有效,但也可能会影响其他不应修改的模板。

我试过了,但它不能正常工作。\{\{mul\|\b(\w+)\s*\|\s*(?=.*\1)

注意:维基百科模板封装在双大括号中,其名称后跟参数和值,用竖线分隔。在这里,参数是未命名和不存在的,模板被命名为“mul”,它给出{{mul|<foo>|<bar>|<baz>|<...>}}

表达式正则 表达式环顾四 周维基百科

评论

3赞 Kaddath 11/18/2023
你说你想换成,这些对我来说都是一样的,你的问题有错误吗?{{mul|fr|en|fr}}{{mul|fr|en|fr}}
1赞 Wiktor Stribiżew 11/18/2023
应该做一些事情。(?<={{mul\|(?:(?!{{|}}).)*?)\b(\w+)\|(?=(?:(?!{{|}}).)*?\|\b\1\b)
0赞 oli_vi_er 11/18/2023
对不起,kaddath,我在写作时犯了一个错误,实际上是。感谢您的快速回答 Wiktor Stribiżew,我认为它很好用。{{mul|fr|en}}
1赞 InSync 11/18/2023
@WiktorStribiżew 这将与连续的参数值不匹配:。{{mul|en|fr|fr}}

答:

1赞 Wiktor Stribiżew 11/18/2023 #1

你可以使用

(?<={{mul\|(?:(?!{{|}}).)*?)\b(\w+)\|(?=(?:(?!{{|}}).)*\b\1\b)

请参阅正则表达式演示

细节

  • (?<={{mul\|(?:(?!{{|}}).)*?)- 可变长度的后视(在 .NET 正则表达式风格中受支持),它与紧跟在前面的位置匹配,该位置前面有 + 零个或多个(但尽可能少)重复的任何字符,该字符不是 a 和 char 序列的起点{{mul|{{}}
  • \b(\w+)\|- 一个或多个单词字符(捕获到第 1 组中),然后是一个字符|
  • (?=(?:(?!{{|}}).)*\b\1\b)- 正向前看,需要零次或更多次(但尽可能少)重复任何不是 a 和 char 序列起点的字符,然后将 Group 1 值作为紧邻当前位置右侧的整个单词。{{}}

评论

1赞 oli_vi_er 11/18/2023
我只是在一些测试中注意到,如果前两个值相同,您的旧版本将不起作用,例如 感谢您更正它。{{mul|en|en|fr|de}}