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

5 regular-expression

我想有一个目标,与开头的行表达HTTP,与最终icon.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
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 2

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

\n\n

http\xe2\x80\x9cbegin with 、 end withicon.ico且不包含config.privoxy.org\xe2\x80\x9d 的正则表达式为:

\n\n
^http([^c]|c[^o]|co[^n]|\xe2\x80\xa6|config\\.privoxy\\.or[^g])*(c(o(n(f(\xe2\x80\xa6o(rg?)?)?)?)?)?)?icon\\.ico$\n
Run Code Online (Sandbox Code Playgroud)\n\n

(我希望我答对了。请注意,有相当多的 \xe2\x80\xa6 需要填写。)

\n\n

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

\n\n
^http(?!.*config\\.privoxy\\.org).*icon\\.ico$\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,(?!\xe2\x80\xa6)必须小心使用:如果您不注意,它的含义可能不是您认为的含义。例如:

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

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

\n\n
^https?://(?!config\\.privoxy\\.org/).*/favicon\\.ico$\n
Run Code Online (Sandbox Code Playgroud)\n