Регулярное выражение для удаления субдомена из корневого домена в списке - Notepad ++ или Gvim - PullRequest
0 голосов
/ 22 июня 2011

У меня есть список URL-адресов, сохраненных в текстовом файле (я использую Windows 7).

Формат URL-адресов следующий:

somesite1.com
somesite2.com
somesite3.com
sub1.somesite3.com
sub2.somesite3.com
sub3.somesite3.com
sub1.somesite3.net
sub1.somesite1.org

В notepad ++ есть возможность использовать «найти-заменить с регулярными выражениями», и я вполне уверен, что gvim позволяет пользователю регулярных выражений (хотя я не совсем уверен, как использовать их в Gvim) .

В любом случае, я не знаю, что добавить в поля поиска и замены, чтобы он мог просматривать содержимое файла и оставлять мне только корневые домены. Если все сделано правильно, приведенный выше список примеров превратится в следующее:

somesite1.com
somesite2.com
somesite3.com
somesite3.com
somesite3.com
somesite3.com
somesite3.net
somesite1.org

Может ли кто-нибудь мне помочь?

Ответы [ 3 ]

4 голосов
/ 22 июня 2011

Несколько способов сделать это для Vim (конечные слэши также необязательны):

:%s/^.\+\.\ze[^.]\+\.[^.]\+$//
:%s/^.\+\.\([^.]\+\.[^.]\+\)$/\1/

См. Также :help /\ze и т. Д. \ze и \zs относятся к Vim иочень полезно.В Vim и PCRE также могут быть полезны предварительные и предварительные утверждения.

Я считаю, что Notepad ++ использует PCRE;найти ^.+\.([^.]+\.[^.]+)$ и заменить его на \1 должно работать (но я не использую Notepad ++).

Имейте в виду, что это не будет хорошо работать с доменами верхнего уровня с кодом страны, которые используют регистрацию третьего уровня -example.com.au будет превращено в com.au.Кроме того, есть некоторые страны, которые используют регистрацию второго уровня * или по определенным правилам ... если вы заботитесь об этих случаях, вам понадобится больше правил, и полный анализатор будет лучше обычноговыражение (хотя как всегда это было бы возможно с регулярными выражениями).

1 голос
/ 22 июня 2011

Заменить ^[^.]*\.(?=\w+\.\w+$) на <blank>

Расшифровано, это означает:

  • ^ = начало строки
  • [^.]* = любое количество символов, которые не являются точками
  • \. = точка
  • (?=[^.]+\.[^.]+$) = должно быть ровно одно слово, одна точка, затем одно слово отсюда до конца

РЕДАКТИРОВАНИЕ - Добавлен прогноз на еще одну точку

ВНОВЬ ИЗМЕНЕНО - Изменен взгляд на ровно одну точку между словами

0 голосов
/ 22 июня 2011

Заменить всю строку на Последнее слово и предыдущее слово одного.

%s/^.*\.\(\w\+\.\w\+\)$/\1/g

Обратите внимание, что vim требует \, (, ) для +, как \+

ОБНОВЛЕНИЕ:

%s/^.*\.\([0-9a-z\-]\+\.[0-9a-z\-]\+\)$/\1/g

лучше, может быть.

...