文字列を除外する正規表現

文字列を除外する正規表現

次に始まるすべての行の表現をしたい。http、 で終わるicon.icoそして欲しくない含むconfig.privoxy.org。下の例のリストでは、上から3番目と4番目の項目を除くすべての項目をキャプチャしたいと思います。

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。これは正規表現の否定ではなく、幅0の否定予測アサーション(幅0:空の文字列と一致し、予測アサーション:直後に現れることを制限し、否定:表示されない可能性のある制限を示します)です。

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

注意して(?!…)使用してください。気を付けないと思う意味ではないかもしれません。たとえば、

  • ^http(?!config\.privoxy\.org).*icon\.ico$接頭辞の直後には表示されないhttp://config.privoxy.org/icon.icoため、一致します。config\.privoxy\.orghttp
  • ^http(?!.*config\.privoxy\.org)icon\.ico$接頭辞の直後に来る必要http://foo/icon.icoがあるため、一致しません(その間の内容は空の文字列にのみ一致できます)。icon.icohttp
  • ^http.*(?!config\.privoxy\.org).*icon\.ico$matchは、一致がin(そしてfirst、inなど)にあるhttp://config.privoxy.org/icon.icoためです。(?!config\.privoxy\.org):/oconfig

私の考えにあなたが追いかけているのは事実

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

答え2

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

単一の正規表現ではありませんが、本当に簡単です。

関連情報