提问人:oli_vi_er 提问时间:11/18/2023 最后编辑:oli_vi_er 更新时间:11/18/2023 访问量:45
用于删除特定维基百科模板中重复值的正则表达式
Regex for removing duplicate values in a specific Wikipedia template
问:
我正在尝试使用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>|<...>}}
答:
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}}
评论
{{mul|fr|en|fr}}
{{mul|fr|en|fr}}
(?<={{mul\|(?:(?!{{|}}).)*?)\b(\w+)\|(?=(?:(?!{{|}}).)*?\|\b\1\b)
{{mul|fr|en}}
{{mul|en|fr|fr}}