Быстро обрезать ссылки до доменов Memo

Как в Memo1 обрезать ссылки до доменов удалив все https и http.

https://site1.ru/threads/fdfddd2/
http://site2.ru/threads/fdfddd23434/
https://site3.ru/threads/fdfddd434/

Что бы на выходе получилось

site1.ru
site2.ru
site3.ru

Обрезаю вот так но это очень долго если ссылок 1000 - 3000 ссылок!

// В начале удаляю все до //
    for i:= 0 to Memo1.Lines.Count - 1 do
  Memo1.Lines[i]:= Copy(Memo1.Lines[i], Pos('/', Memo1.Lines[i]) + 2, MaxInt);

// А после удаляю все после
  for i:= 0 to Memo1.Lines.Count - 1 do
  Memo1.Lines[i]:= Copy(Memo1.Lines[i], 1, Pos('/', Memo1.Lines[i])-1);

Ответы (1 шт):

Автор решения: Kromster

Как обычно уже, не работайте с текстом в VCL компонентах напрямую, это каждый раз вызывает кучу пересчетов. Заберите текст из Мемо, обработайте, положите обратно.

Если нужно именно http обрезать, то как минимум вот так будет в разы быстрее:

s := Memo1.Lines.Text;
s := StringReplace(s, 'https:', '', [rfReplaceAll]);
s := StringReplace(s, 'http:', '', [rfReplaceAll]);
Memo1.Lines.Text := s;

Для удаления всего после / уже придется работать построчно.


Вот такой вариант работает почти мгновенно на 4000 строках. Посмотрите что тут делается:

procedure TForm1.Memo1Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  // Достаем текст и делаем авто-замену
  s := Memo1.Lines.Text;
  s := StringReplace(s, 'https://', '', [rfReplaceAll]);
  s := StringReplace(s, 'http://', '', [rfReplaceAll]);
  Memo1.Lines.Text := s;

  // Читаем из списка и складываем в новый список (строку с переносами)
  s := '';
  for i := 0 to Memo1.Lines.Count - 1 do
    s := s + Copy(Memo1.Lines[i], 1, Pos('/', Memo1.Lines[i]) - 1) + sLineBreak;

  Memo1.Lines.Text := s;
end;

Ну и конечно же, по-хорошему, подготовку (обрезку) данных надо делать ДО помещения в интерфейс.

→ Ссылка