LINUX.ORG.RU

Регулярное выражение для IP адреса


0

0

Подскажите subj для POSIX regex, возможно ли это вообще?

Вот кусочек кода, который считает 192.168 нормальным IP адресом :-(

#include <sys/types.h>
#include <regex.h>
#include <stdio.h>

int main() {
int rcres, reres;
char *mypattern = "^([0-9]|[0-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[0-9][0-9]|[01] [0-9][0-9]|
2[0-4][0-9]|25[0-5])\.([0-9]|[0-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])\.([ 0-9]|[0-9][0-9]|[01][0-9][0-9]|2[
0-4][0-9]|25[0-5])$";
regex_t rcc;
char *s1 = "192.168";
char *s2 = "192.168.0.111";
char *s3 = "255.255.";
char *s4 = "255.255.255.0";

if (rcres = regcomp(&rcc, mypattern, REG_EXTENDED)) fprintf(stderr, "BAD REGCOMP\n");

if (reres = regexec(&rcc, s1, 0L, NULL, 0)) fprintf(stderr, "BAD REGEXEC: %s\n", s1);
if (reres = regexec(&rcc, s2, 0L, NULL, 0)) fprintf(stderr, "BAD REGEXEC: %s\n", s2);
if (reres = regexec(&rcc, s3, 0L, NULL, 0)) fprintf(stderr, "BAD REGEXEC: %s\n", s3);
if (reres = regexec(&rcc, s4, 0L, NULL, 0)) fprintf(stderr, "BAD REGEXEC: %s\n", s4);

return 0;
}

★★★★★

irb(main):002:0> pattern = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
irb(main):003:0> "192.168" =~ pattern
=> nil
irb(main):004:0> "192.168.0.111" =~ pattern
=> 0
irb(main):005:0> "255.255." =~ pattern
=> nil
irb(main):007:0> "255.255.255.0" =~ pattern
=> 0

PartyZan ★★★
()
Ответ на: комментарий от PartyZan

Почему то приведенное регулярное выражение совсем не работает с regexec - все строки оказались неправильными :-( хотя компилируется правильно.

saper ★★★★★
() автор топика
Ответ на: комментарий от PartyZan

\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

Да я ведь там уже был и пробовал уже этот regexp...

Блин :-) Нужно было ставить \\ вместо \ :-) Спасибо, извините за беспокойство :-) Уже поздно, вот и не сообразил ;-) С \\ перед точками и мой работает.

saper ★★★★★
() автор топика

Во-первых, ты неправильно пишешь regexp. Не "\.", а "\\.". И не "(", а "\\(". (man прочитай, да).

Во-вторых, ты неправильно формируешь regexp для IP. Он у тебя срабатывает на адреса типа 0.0.0.0, 000.000.00.01 и т.п.

execve
()
Ответ на: комментарий от execve

> И не "(", а "\\(". (man прочитай, да). Спасибо, посмотрю, только не припомню.

> Он у тебя срабатывает на адреса типа 0.0.0.0, 000.000.00.01 и т.п. Мне эти адреса тоже нужны, маршрутизатор по-умолчанию без них не задать.

saper ★★★★★
() автор топика
Ответ на: комментарий от execve

> И не "(", а "\\(". (man прочитай, да).

А собственно чей? :-\ В Linux не нашел ничего про скобки...

saper ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.