Это для удобства, но это - также lower-than-user-level диагностика. Можно изолировать проблему, у Вас есть с сервисом тот путь, например: у Joe есть сервер базы данных и клиент. Они не связываются. Проблема в сети? Сервер? Клиент?
Joe переходит к клиентской машине и открывает оболочку. Он использует telnet, как Вы описали:
telnet server.ip.com 3333
и вводит команду, как будто он был клиентской программой
WHO;
Сервер отвечает с
'11','JOE.CORP.COM'
(Это - очень немой сервер),
Таким образом Joe знает, что сетевой канал к работам сервера, и что его клиент, вероятно, не настроен правильно.
Математически говоря, если регулярное выражение распознает определенный набор исходных данных, то существует регулярное выражение, которое распознает дополнительный набор. Если Вы знаете, что регулярные выражения эквивалентны конечным автоматам, это очевидно: подкачайте принятие и непринятие состояний в автомате. Однако размер регулярного выражения для дополнения может вырасти экспоненциально с размером исходного регулярного выражения, таким образом, это является часто непрактично большим.
Регулярное выражение для “начинается http
, конец с icon.ico
и не содержите config.privoxy.org
”:
^http([^c]|c[^o]|co[^n]|…|config\.privoxy\.or[^g])*(c(o(n(f(…o(rg?)?)?)?)?)?)?icon\.ico$
(Я надеюсь, что разобрался в нем. Обратите внимание, что существует довольно мало … для заполнения.)
К счастью, Privoxy принимает больше, чем математические регулярные выражения: это понимает расширения Perl, включая (?!foo)
соответствовать пустой строке, когда это сопровождается чем-либо, но foo
. Это - нулевая ширина отрицательное предварительное утверждение (нулевая ширина: соответствует пустой строке; предварительное утверждение: ограничивает то, что может прибыть сразу впоследствии; отрицательный: ограничение выражается с точки зрения того, что не может появиться), не regex отрицание.
^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$
не соответствует http://foo/icon.ico
, потому что icon.ico
должен сразу прибыть после http
префикс (то, что между ними, может только соответствовать только пустой строке).^http.*(?!config\.privoxy\.org).*icon\.ico$
соответствия http://config.privoxy.org/icon.ico
, потому что (?!config\.privoxy\.org)
соответствия в :
(а также в первом /
, в o
в config
, и т.д.).Я думаю, что Вы, после на самом деле
^https?://(?!config\.privoxy\.org/).*/favicon\.ico$
sed -n '/config\.privoxy\.org/d; /^http.*icon\.ico$/p'
Это не единственный regex, но это, конечно, просто.