Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Список IP с помощью регулярного выражения


Автор: Serebrus 11.6.2009, 14:46
Привет народ Винграда.
Допустим есть строка (длинная) или текст, в котором имеются IP адреса. Надо составить список IP адресов с помощью регулярного выражения.
Регулярное выражение для IP несложное: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

Автор: Serebrus 11.6.2009, 15:05
Я пробовал так:
Допустим текст такой: 2рло jkhjkhjkh 192.168.10.10 192.168.10.12 jdkfhsf рашгршр 192.168.10.2
Код

procedure GetIPList(Str, RegStr: String; LB: TListBox);
var RE: TRegExpr;
    Ulist: TStrings;
    i: Integer;
begin
RE:=TRegExpr.Create;
Ulist:=TStrings.Create;
 try
  RE.Expression := RegStr;
  RE.Split(Str, Ulist);
  for i:=1 to Ulist.Count do
    LB.Items.Add(Ulist.Strings[i-1]);
 finally
  RE.Free;
  Ulist.Free;
 end;
end;
//Вызов
GetIPList('2рло jkhjkhjkh 192.168.10.10 192.168.10.12 jdkfhsf рашгршр 192.168.10.2', '\s*[а-яА-Яa-zA-Z]{1,}\s*', Form1.IPList);
//Результат
2

192.168.10.10 192.168.10.12

192.168.10.2

В результате 5 строк, 2я и 4я строка пустая.
Мне надо:
192.168.10.10
192.168.10.12
192.168.10.2
Как исправить?

Автор: dumb 11.6.2009, 15:21
пишешь регулярку для выделения адресов:
Цитата(Serebrus @  11.6.2009,  15:46 Найти цитируемый пост)
Регулярное выражение для IP несложное: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

а потом вызываешь с каким-то странным:
Цитата(Serebrus @  11.6.2009,  16:05 Найти цитируемый пост)
'\s*[а-яА-Яa-zA-Z]{1,}\s*'

в чем прикол?

Автор: Serebrus 11.6.2009, 16:09
dumb, я написал регулярку для IP (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}), потому что думал, с помощью этого регулярного выражения можно найти IP. Но оказывается, можно найти а не вырезать IP.

Автор: Serebrus 11.6.2009, 17:28
Братцы, почти удалось. Поменял \s*[а-яА-Яa-zA-Z]{1,}\s* на \s*[а-яА-Яa-zA-Z\s*]{1,}\s*.
Результат:
2
192.168.10.10
192.168.10.12
192.168.10.2


Все таки остается первая строка остается (значение: 2), но этот результат в полне удовлетворяет чем первый.

Автор: WandG 11.6.2009, 19:11
Если задача позволяет, то можно просто в лоб - брать получившийся список и оставить в нем только то, что подходит под \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

Автор: AntonN 11.6.2009, 23:01
Serebrus, во первых у TStrings нет конструктора (неужели после D7 появился? smile )
во вторых:
Код

procedure GetIPList(Str, RegStr: String; LB: TListBox);
var RE: TRegExpr;
    i: Integer;
begin
RE:=TRegExpr.Create;
 try
  RE.Expression:=RegStr;
  if ExecRegExpr(RegStr,Str) then 
   if RE.Exec(Str) then begin
     repeat
       LB.Items.Add( RE.Match[0] );
     until not RE.ExecNext;
  end;
 finally
  RE.Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 GetIPList('2er4445435 jkhjkhjkh 192.168.10.10 192.168.10.12 jdkfhsf nhsyltw! 192.168.10.2', '\b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b', ListBox1);
end;


Добавлено @ 23:04
еще можно над регулярочкой покорпеть, дабы выдирало именно IP, а не скушало 482.325.478.111 smile
Код

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Автор: Akella 12.6.2009, 09:58
http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)