2016-05-06 2 views
2

Надеюсь, кто-то может помочь, это сводит меня с ума!Regex удалить www с URL

Я пытаюсь изменить фильтры Logstash Grok для анализа имени домена. В настоящее время в регулярном выражении: \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b) и правильно разделяет домен, необходимо добавить дополнительную проверку, чтобы удалить www..

Это то, что я придумал до сих пор:

\b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(^(?<!www$).*$?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b) 

я могу только показаться, чтобы сохранить www. часть домена, а не сам домен. Пример того, что мне нужно для достижения: www.stackoverflow.com должно быть stackoverflow.com.

Мне нужно удалить конкретно www., а не весь поддомен.

Спасибо заранее!

ОБНОВЛЕНИЕ

Пример входы ожидаемых результатов (с использованием этот пост в качестве примера): в его текущее состояние: https://stackoverflow.com/questions/37070358/ возвращается www.stackoverflow.com

Что мне нужно для того, чтобы вернуть stackoverflow.com

+0

Почему бы не захватить доменное имя без части www? – CinCout

+0

Если я правильно истолковываю ваш вопрос, мне нужно включить субдомены, например: blog.stackoverflow.com, но специально хотите удалить www. Поэтому я попробовал обратное. Не знаете, как просто захватить доменное имя? – josh

+0

, так что вы хотите также поддомен, только если это www, вы хотите его отбросить? Можете ли вы показать нам возможные исходные данные? – CinCout

ответ

2

Вы можете добавить (?!www\.) и (?!http:\/\/www\.) негативные взгляды сразу после первого \b исключить совпадение www. или http://www.:

\b(?!www\.)(?!http:\/\/www\.)(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(?:\.?|\b) 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

См regex demo

Вы можете добавить больше отрицательных lookaheads исключить https:// или ftp/ftps ссылки.

АЛЬТЕРНАТИВА:

\b(?!(?:https?|ftps?):\/\/)(?!www\.)(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(?:\.?|\b) 

См this regex demo

The (?!(?:https?|ftps?):\/\/) и (?!www\.) lookaheads просто позволит вам пропустить протокол и www части URL-адреса.

+0

Это работает без «http/https: //» перед доменом ... К сожалению, в большинстве доменов это есть. – josh

+0

Это не проблема: '\ b (?! Www \.) (?! http: \/\/www \.) (?: [0-9A-Za-z] [0-9A-Za-z -] {0,62}) (: \ (: [0-9A-Za-Z] [0-9A-Za-Z -] {0,62}?.?)) * (?.? \ | \ b) ' –

+0

Спасибо вам большое! Работает отлично! – josh

0

Это будет соответствовать детали после www, если URL-адрес начинается с www.

(?!www\.)\b(?:(?!-)[0-9A-Za-z]{1,63})(?:\.(?:(?!-)[0-9A-Za-z-]{1,63}))*(\.?|\b) 

Я упростил все оставшиеся регулярное выражение слишком используя негативный взгляд вперед для - в субдоменах.