正则表达式捕获的比想要的多 [重复]

Regex captures more than wanted [duplicate]

提问人:oli_vi_er 提问时间:9/27/2023 最后编辑:Gilles Quénotoli_vi_er 更新时间:9/27/2023 访问量:62

问:

我想使用AutoWikiBrowser(正则表达式风格)删除维基百科上的引用,这是一个处理正则表达式的自动编辑器,但我面临着标签的新手问题。

例如,我想删除所有包含 的引用,例如example.com

<ref>{{cite web|title=Bar|url=https://example.com/bar}}</ref>

我尝试了基本的正则表达式(替换为什么都没有),但它也捕获了遇到第一个标签后的所有内容,例如:<ref>.*?example.com.*?</ref><ref>

<ref>{{cite web|title=Foo|url=https://zzz.com/foo}}</ref> blah-blah <ref>{{cite web|title=Bar|url=https://example.com/bar}}</ref>

我尝试使用标签进行环顾,但问题是它没有捕获标签。

很抱歉问这么简单的问题,但在过去的一个小时里,我一直在寻找无济于事,我的英语说得很流利,但在技术术语方面却不行......

.NET Regex 标签 维基百科上的数据

评论


答:

0赞 Nick 9/27/2023 #1

您可以使用此正则表达式,它将匹配在关闭之前包含的标记:<ref>example.com</ref>

<ref>(?:(?!<\/ref>).)*example\.com.*?<\/ref>

这匹配:

  • <ref>:字符<ref>
  • (?:(?!<\/ref>).)*:不以结束标记开头的任意数量的字符(使用回火的贪婪令牌</ref>)
  • example\.com:字符example.com
  • .*?:最小字符数
  • <\/ref>:字符</ref>

regex101 上的演示

注意:根据正则表达式引擎及其正则表达式分隔符,您可能不需要 in 之前的\/</ref>

评论

0赞 oli_vi_er 9/27/2023
感谢您的快速回答。我真的应该了解这些环顾之忧,我仍然不清楚这种“正面展望/非捕获组/负面展望”是如何运作的......
0赞 Nick 9/27/2023
@oli_vi_er链接的文章(以及整个网站)非常有用,这个问题也非常有用
0赞 oli_vi_er 9/27/2023
我还有一个问题:如果 <ref></ref> 标签内有多行,你会怎么做?单行似乎无法正常工作。
0赞 Nick 9/27/2023
@oli_vi_er它应该与以下标志一起使用:regex101.com/r/npHdSW/1。你用的是什么语言?s
0赞 oli_vi_er 9/27/2023
AutoWikiBrowser(.net正则表达式风格),由Gilles Quénot编辑?我已经尝试勾选了“单行”框,它从前面的 <ref> 标签中捕获