문자열을 제외하는 정규식

문자열을 제외하는 정규식

다음으로 시작하는 모든 줄에 대한 표현을 원합니다.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

내가 생각할 수 있는 최선의 방법은 '^.{19}[^x].*icon\.ico$'이것이 저렴한 해결 방법이라는 것 입니다.엑스비교적 드물다. 내가 하고 싶은 일을 하는 완벽하고 올바른 방법이 있나요?

답변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$

(제대로 되었기를 바랍니다. 작성해야 할 내용이 많다는 점에 유의하시기 바랍니다.)

다행스럽게도,은둔단순한 수학적 정규식 이상의 것을 허용합니다.펄 확장, 포함하다(?!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'    

단일 정규 표현식은 아니지만 정말 간단합니다.

관련 정보