Что не так с этим регулярным выражением для соответствия URL? - PullRequest
0 голосов
/ 14 ноября 2009

У меня возникли некоторые трудности при настройке регулярного выражения для сопоставления URL-адреса с использованием библиотеки regex.h в C. У меня есть работающее регулярное выражение IP, которое я надеялся преобразовать для соответствия простой строке, такой как www.alphanumerictext12.com|edu|org , Что-то не так с моим синтаксисом в самом определении регулярного выражения.

Ниже приведен рабочий код IPREGEX и моя попытка регулярного выражения URL.

#define IPEXPR    "([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})"
#define URLEXPR "(www)\\.((?:[a-z][a-z]*[0-9]+[a-z0-9]*))\\.(com|edu|org)"

regex_t regex;

if(regcomp(&regex, IPEXPR, REG_EXTENDED) != 0)
  return 0;

if(regexec(&regex, inputURL, 0, NULL, 0) != 0)
  return 0;

Ответы [ 4 ]

2 голосов
/ 14 ноября 2009

Попробуйте:

"www\\.[a-z]+[a-z0-9]*\\.(com|edu|org)"

Я удалил [0-9]+ и заменил [a-z][a-z]* на [a-z]+.

1 голос
/ 14 ноября 2009

Проблема в (?: ), вам нужно просто (www)\\.([a-z][a-z]*[0-9]+[a-z0-9]*)\\.(com|edu|org).

Кстати, ваше внутреннее выражение говорит: «хотя бы один буквенный символ, затем хотя бы один цифровой символ, затем любые буквенно-цифровые символы». Это то, что вы имеете в виду? Если это так, вы можете сделать его немного короче: [a-z]+[0-9]+[a-z0-9]*.

0 голосов
/ 15 ноября 2009

Вы, вероятно, должны использовать inet_pton(), который является стандартной функцией POSIX (заменяет inet_aton()) и обрабатывает оба формата адресов: IPv4 и IPv6.

0 голосов
/ 14 ноября 2009

С Код ужасов :

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения. "Теперь у них есть две проблемы.

Что я имею в виду: вы уверены, что регулярное выражение - лучший способ решить вашу проблему? Может быть, вы можете проверить, является ли строка URL-адрес более легким методом?


Редактировать

Следующая программа на моем компьютере, вывод которой перенаправлен на /dev/null, печатает (на stderr)

rx time: 1.730000
lw time: 0.920000

Список программ:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
#include <string.h>
#include <time.h>

int goodurl_rx(const char *buf) {
  static regex_t rx;
  static int done = 0;
  int e;

  if (!done) {
    done = 1;
    if ((e = regcomp(&rx, "^www\\.[a-z][a-z0-9]*\\.(com|edu|org)$", REG_EXTENDED)) != 0) {
      printf("Error %d compiling regular expression.\n", e);
      exit(EXIT_FAILURE);
    }
  }
  return !regexec(&rx, buf, 0, NULL, 0);
}

int goodurl_lw(const char *buf) {
  if (*buf++ != 'w') return 0;
  if (*buf++ != 'w') return 0;
  if (*buf++ != 'w') return 0;
  if (*buf++ != '.') return 0;
  if (!isalpha((unsigned char)*buf++)) return 0;
  while (isalnum((unsigned char)*buf)) buf++;
  if (*buf++ != '.') return 0;
  if ((*buf == 'c') && (*(buf+1) == 'o') && (*(buf+2) == 'm') && (*(buf+3) == 0)) return 1;
  if ((*buf == 'e') && (*(buf+1) == 'd') && (*(buf+2) == 'u') && (*(buf+3) == 0)) return 1;
  if ((*buf == 'o') && (*(buf+1) == 'r') && (*(buf+2) == 'g') && (*(buf+3) == 0)) return 1;
  return 0;
}

int main(void) {
  clock_t t0, t1, t2;
  char *buf[] = {"www.alphanumerics.com", "ww2.alphanumerics.com", "www.alphanumerics.net"};
  int times;

  t0 = clock();
  times = 1000000;
  while (times--) {
    printf("    %s: %s\n", buf[0], goodurl_rx(buf[0])?"pass":"invalid");
    printf("    %s: %s\n", buf[1], goodurl_rx(buf[1])?"pass":"invalid");
    printf("    %s: %s\n", buf[2], goodurl_rx(buf[2])?"pass":"invalid");
  };
  t1 = clock();
  times = 1000000;
  while (times--) {
    printf("    %s: %s\n", buf[0], goodurl_lw(buf[0])?"pass":"invalid");
    printf("    %s: %s\n", buf[1], goodurl_lw(buf[1])?"pass":"invalid");
    printf("    %s: %s\n", buf[2], goodurl_lw(buf[2])?"pass":"invalid");
  } while (0);
  t2 = clock();

  fprintf(stderr, "rx time: %f\n", (double)(t1-t0)/CLOCKS_PER_SEC);
  fprintf(stderr, "lw time: %f\n", (double)(t2-t1)/CLOCKS_PER_SEC);
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...