正则表达式想要排除一个字符串

正则表达式想要排除一个字符串

我想要一个针对以以下开头的所有行的表达式http, 结束于图标.ico不要包含config.privoxy.org。在下面的示例列表中,我想捕获除第三和第四条目(从顶部开始)之外的所有条目。

http://cdn.sstatic.net/askubuntu/img/favicon.ico
http://cdn.sstatic.net/unix/img/favicon.ico
http://config.privoxy.org/error-favicon.ico
http://config.privoxy.org/favicon.ico
http://economictimes.indiatimes.com/icons/etfavicon.ico
http://forums.linuxmint.com/images/favicon.ico
http://forums.mozillazine.org/static/common/images/favicon.ico
http://gmane.org/favicon.ico
http://mail.yimg.com/ok/u/assets/img/favicon-yhoo.ico
http://portableapps.com/favicon.ico
https://help.ubuntu.com/favicon.ico
https://www.axisbank.co.in/favicon.ico
http://user.services.openoffice.org/favicon.ico
http://www.gardnermuseum.org/favicon.ico
http://www.theregister.co.uk/favicon.ico
http://www.webupd8.org/favicon.ico
http://www.wilderssecurity.com/favicon.ico

我能想到的最好的办法是'^.{19}[^x].*icon\.ico$'这是一个廉价的解决方法,因为X是比较少见的。有没有一种万无一失、正确的方法来做我想做的事?

答案1

从数学上来说,如果正则表达式识别一组特定的输入,那么就存在一个识别补集的正则表达式。如果您知道正则表达式相当于有限自动机,那么很明显:交换自动机中的接受和不接受状态。但是,补集正则表达式的大小可能会随着原始正则表达式的大小呈指数级增长,因此它通常大得不切实际。

http“以 开头、以 结尾icon.ico且不包含config.privoxy.org”的正则表达式为:

^http([^c]|c[^o]|co[^n]|…|config\.privoxy\.or[^g])*(c(o(n(f(…o(rg?)?)?)?)?)?)?icon\.ico$

(我希望我答对了。请注意,有很多……需要填写。)

幸运的是,隐私接受的不仅仅是数学正则表达式:它理解Perl 扩展, 包括(?!foo)当空字符串后跟除 之外的任何内容时,匹配空字符串foo。这是一个零宽度负向先行断言(零宽度:匹配空字符串;先行断言:限制之后可能立即出现的内容;负:以可能不会出现的内容表示限制),而不是正则表达式否定。

^http(?!.*config\.privoxy\.org).*icon\.ico$

请注意,(?!…)必须谨慎使用:如果您不注意,它可能不是您认为的意思。例如:

  • ^http(?!config\.privoxy\.org).*icon\.ico$匹配http://config.privoxy.org/icon.ico,因为config\.privoxy\.org它不会立即出现在http前缀之后。
  • ^http(?!.*config\.privoxy\.org)icon\.ico$不 match http://foo/icon.ico,因为icon.ico必须紧接在http前缀之后(它们之间的内容只能匹配空字符串)。
  • ^http.*(?!config\.privoxy\.org).*icon\.ico$matches http://config.privoxy.org/icon.ico,因为(?!config\.privoxy\.org)匹配位于:(以及第一个/、位于oinconfig等)。

我认为你所追求的实际上是

^https?://(?!config\.privoxy\.org/).*/favicon\.ico$

答案2

sed -n '/config\.privoxy\.org/d; /^http.*icon\.ico$/p'    

它不是一个单一的正则表达式,但它确实很简单。

相关内容