除非包含特定单词,如何匹配找到的所有字符串?

时间:2019-07-11 11:35:23

标签: regex

所以我试图使此正则表达式字符串起作用以查找文本上的匹配项,该匹配项不包括中间带有“头像”字词的匹配项:

http.{5,10}(media.tumblr).+?(?!avatar).+?(png|jpg|jpeg|gif|swf)/g

在此通用样本上,它应仅与1º和3º匹配,但与所有匹配(引用特定的匹配项):

1º"httpghghghmedia.tumblrfgdfdfgif"rdfgifgjdthythpng
2º"httpahttvhmedia.tumblrffdfavatarfgdfdfgif"rdfgifadadadadad
3ºdg"httpghghghmedia.tumblrfgdfdfgif"addadaa
4ºuilfgfgfpo"httpdsfsdfmedia.tumblrDDavatarsdfsdpng"

我尝试了其他方法,有些方法甚至太复杂而无法使用,但是对于同一问题或引用的大多数答案都没有考虑何时需要使用两次“。+?”。或在不同位置以“。+?”分隔的多个搜索模式,如“ media.tumblr”和“ gif”从我的测试中,哪个在负向后看之前被忽略,所以任何人都可以告诉我是否有解决此问题的方法? regex101和帮助教程对我没有帮助:/

1 个答案:

答案 0 :(得分:2)

TL; DR完整正则表达式

http.{5,10}(?:media.tumblr)(?:(?!avatar).)+?(?:png|jpg|jpeg|gif|swf)

为什么失败

.+?(?!avatar).+?<anything else>

第一个.+?与一个字符匹配(因为它是惰性量化的)。 如果接下来找到字符串avatar,那么它也将与化身的a相匹配 第二个.+?匹配所有其他内容,直到anything else可以匹配为止。

解决方案

替换为

(?:(?!avatar).)+?<anything else>

为什么起作用

(?!avatar).匹配不是字符串avatar开头的单个字符。 (?:(?!avatar).)+?部分(懒惰地)匹配满足该属性的所有字符。而且,如果两个字符都不是avatar的起始字符,则不能包含该字符串。