Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
1
RAD XE3+

Как распарсить IP адрес регулярным выражением

05.09.2022, 21:43. Показов 2259. Ответов 26

Author24 — интернет-сервис помощи студентам
Решил получить внешний IP адрес. (опять мой код который работал под D7 - перестал работать на D11 ) и я начал искать альтернативу и нашел:

Пример чисто тестовый.
Часть кода взята отсюда


Работу со строкой наваял сам.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{ Внешний IP адрес по материалам видео
https://www.youtube.com/watch?v=QfRWhBdLrUA }
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  s, ip : String;
begin
 
s:= IDHTTP1.GET('http://checkip.dyndns.com/');
  For i:=1 To Length(s) Do
   begin
    If s[i] In ['0'..'9','.'] Then
     ip:=ip+s[i];
   end;
  Form1.Caption:=ip; //сам адрес
End;
Знаю что того же эффекта можно добиться таким регулярным выражением:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d {1,3})
или так:
((?:\d{1,3}\.){3}\d{1,3})
Это то же, из материалов форума

Но как, не знаю, то что мне удавалось найти было похоже на огромные простыни.
Сам, с регулярными выражениями никогда не работал, если знаете как плиз подскажите.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2022, 21:43
Ответы с готовыми решениями:

Разложить адрес по частям не регулярным выражением
Здравствуйте. Есть адреса поступающие из Prom ua. Они отличаются по формату друг от друга. Вот...

Как выбрать стиль регулярным выражением
Всем привет! Столкнулся с такой проблемой, нужно выбрать стиль регулярным выражением. Задача такая....

Как проверить регулярным выражением цифру?
Всем привет! Нужно проврить переменную, имеет она значение 1 или 0 проверяется через test делал...

Как подключить разбор элемента регулярным выражением?
Добрый день всем. Столкнулась с такой задачей: заказчик потребовал, чтобы элементы списка...

Как удалить символы ", [ и ] регулярным выражением?
Приветствую. Разбирающиеся в рег. выражениях, приведите пример, пожалуйста, как удалить символы...

26
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,803
Записей в блоге: 3
06.09.2022, 02:21 2
Цитата Сообщение от SeGun Посмотреть сообщение
Работу со строкой наваял сам.
А что, собственно, она умного делает? Только убирает все, что не цифра и не точка. Вот такая строка, 12345., вполне удовлетворяет Вашему "условию", хотя никоим боком не является IP-адресом...
Да и конструкция in применительно к юникодной строке - так себе решение...
0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
06.09.2022, 08:06  [ТС] 3
Да, только убирает все, что не цифра и не точка. Я предварительно посмотрел строку возвращаемую
Delphi
1
IDHTTP1.GET('http://checkip.dyndns.com/');
Конечно программист сайта может это поменять.
И можно добавить проверку на маску IP адреса.

Человек говорит, что есть решение на основе регулярных выражений (не знаю более интересное или нет).
Вот я и хотел спросить как это работает под D11?
Скорее всего, нужно подключить какую-то библиотеку и сравнивать с паттерном возвращаемую сайтом информацию.
Так как я с этим никогда не работал, вот и спросил у форумчан, которые разбираются как работать в D11 с регулярными выражениями, варианты решения.
0
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,803
Записей в блоге: 3
06.09.2022, 11:48 4
Цитата Сообщение от SeGun Посмотреть сообщение
как работать в D11 с регулярными выражениями
А использование регулярок - это прямо обязаловка? Не проще ли самому простенькую функцию проверки написать?
0
Заблокирован
06.09.2022, 13:02 5
Цитата Сообщение от D1973 Посмотреть сообщение
А использование регулярок - это прямо обязаловка?
Вот и я о том жэж подумал.
Думаю, быстрее будет работать самодельная функция, заточенная именно на выдирание IP-адресов. Это же так просто:
1. Встретить в тексте число от 0 до 255, оканчивающееся точкой.
2. Проверить, что после точки идут 3 числа от 0 до 255, разделённые точками.

0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
06.09.2022, 14:03  [ТС] 6
Действительно это не сложно.
Да, пожалуй что вы и правы, незачем вам принимать участие в моем безумии ,
тем более что я уже нашел материал по регулярным выражениям и как уже писал "Пример чисто тестовый" для проверки ранее предложенного решения.

Тему можно закрывать.
0
Заблокирован
06.09.2022, 14:16 7
Цитата Сообщение от SeGun Посмотреть сообщение
тем более что я уже нашел материал по регулярным выражениям
А, ну ладно.
0
0 / 0 / 0
Регистрация: 27.05.2022
Сообщений: 6
06.09.2022, 15:36 8
Сам, с регулярными выражениями никогда не работал, если знаете как плиз подскажите.

XYZ в чистом виде.

И то правда, ведь эта фраза была в самом вопросе.
0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
07.09.2022, 21:52  [ТС] 9
Спасибо, всем за полезные ссылки замечания по существу вопроса!

Для тех кого заинтересует, предлагаю свой вариант решения:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Uses . . . ,RegularExpressions;
 
. . .
 
procedure TForm1.Button6Click(Sender: TObject);
var
  RegEx: TRegEx;
  s, Rv : String;
  M: TMatchCollection;
begin
 s:= IDHTTP1.GET('http://checkip.dyndns.com/');
 Rv:= '((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?)';
 RegEx := TRegEx.Create(Rv);
 M := RegEx.Matches(s, Rv);
 if RegEx.IsMatch(s, Rv)  then
    Form1.Caption:= M.Item[0].Value
    else
    Form1.Caption:= 'IP адрес не найден';
end;
Ах, да еще картинка
Изображения
 
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,375
10.09.2022, 18:22 10
Длинноватый шаблон. А если так: ([\d]+(\.[\d]+)+)
0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
10.09.2022, 18:34  [ТС] 11
Короче, но не вариант.
Миниатюры
Как распарсить IP адрес регулярным выражением  
0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
10.09.2022, 18:45  [ТС] 12
Само выражение взял отсюда . (прошу прощения не удалось добавить ссылку штатным способом).
А по работе с ним, нашел этот материал.
0
Модератор
3629 / 2150 / 759
Регистрация: 15.11.2015
Сообщений: 8,631
10.09.2022, 18:51 13
Цитата Сообщение от SeGun Посмотреть сообщение
не удалось добавить ссылку штатным способом
По ссылке не находит сайт. Какой там адрес должен быть?
0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
10.09.2022, 19:15  [ТС] 14
tps://**********************/questions/706722/%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-ip-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0-%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BA%D0%BE%D0%B9
0
15 / 13 / 2
Регистрация: 21.12.2019
Сообщений: 246
19.04.2023, 16:09 15
А зачем регуляркой то, зачем так сложно?
получаете код страницы и парсите

от Current IP Address: до </body>
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Pars(T_, Text, _T: string): string; 
 var a, b:integer;
 begin
Result := '';
if (T_='') or (Text='') or (_T='') then Exit;
a:=Pos(T_, Text);
if a=0 then Exit else a:=a+Length(T_);
Text:=Copy(Text, a, Length(Text)-a+1);
b:=Pos(_T, Text);
if b>0 then Result:=Copy(Text, 1, b - 1);
 end;
 
procedure ButtonClick(sender:Tobject);
begin
var ip: string:= pars('Current IP Address:',string,'</body>');
end;
0
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
20.04.2023, 09:18  [ТС] 16
Silly_coder, Может полностью рабочий пример покажете, пока вижу обрывки из других тем форума и этот обрывок выдает у меня ошибки.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
20.04.2023, 17:28 17
бином Ньютона йопт
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function ParseIpV4(const s: string; var ip : cardinal) : boolean;
var
  a : TArray<string>;
  i, n : integer;
  c : cardinal;
  b: array [0..3] of bytes absolute c;
begin
  result := false;
  a := s.split(['.']);
  if (length(a) <> 4) then
    exit;
 
  for i:=0 to 3 do
  begin
    if not tryStrToInt(a[i], n) then
      exit;
    if (n < 0) or (n > 255) then
      exit;
    b[3 - i] := n;
  end;
  ip := c;
  result := true;
end;
1
115 / 99 / 16
Регистрация: 23.05.2015
Сообщений: 563
20.04.2023, 19:57  [ТС] 18
Цитата Сообщение от krapotkin Посмотреть сообщение
бином Ньютона йопт
В строке b: array [0..3] of bytes absolute c;

Опечутка, или в биноме нет ничего случайного?

Добавлено через 21 минуту

Я правильно вызываю?
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
var s: String; ip: Cardinal;
begin
  s:='cbcnbcnb192.168.1.254kkkkkk';
  ip:=1921681254;
 if ParseIpV4(s, ip) Then
  Showmessage('IP') else  Showmessage('no IP');
end;
0
Модератор
3629 / 2150 / 759
Регистрация: 15.11.2015
Сообщений: 8,631
20.04.2023, 21:18 19
Цитата Сообщение от SeGun Посмотреть сообщение
ip:=1921681254;
Зачем это? Заранее туда не нужно ничего писать, функция в этой переменной вернёт найденный IP-адрес.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
20.04.2023, 22:08 20
Цитата Сообщение от SeGun Посмотреть сообщение
Опечутка
опечатка ессн
0
20.04.2023, 22:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2023, 22:08
Помогаю со студенческими работами здесь

Как выбрать конкретную ссылку регулярным выражением?
Есть рег выражение (https?:\/\/).* Допустим у меня 4 совпадения: ...

Как объединить два массива с регулярным выражением?
В общем есть некая регулярка, в неё вносим два массива:1) массив выдающий ссылки с другого сайта...

Как определить длину строки, вырезанной регулярным выражением?
Здравствуйте. Собственно вот вопрос, length не подходит...) var url = location.search; var...

Как найти все ссылки шрифтов регулярным выражением?
Всем привет! Начал изучать регулярные выражения и возникла проблема при реализации одного проекта....

Символ } принимается регулярным выражением как буква-цифра
Символ } принимается регулярным выражением как буква-цифра. Регулярное выражение такое: regex...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru