这个正则表达式匹配URL有什么问题?

时间:2009-11-14 15:29:05

标签: c regex url cgi

我在设置正则表达式以使用C中的regex.h库匹配URL时遇到了一些困难。我有一个工作的IP正则表达式,我希望转换为匹配一个简单的字符串,如{{1 }}。我的正则表达式定义本身的语法有问题。

下面是工作的IPREGEX代码和我尝试过的URL正则表达式。

www.alphanumerictext12.com|edu|org

4 个答案:

答案 0 :(得分:2)

尝试:

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

我删除了[0-9]+并将[a-z][a-z]*替换为[a-z]+

答案 1 :(得分:1)

问题出在(?: ),您只需要(www)\\.([a-z][a-z]*[0-9]+[a-z0-9]*)\\.(com|edu|org)

顺便说一下,你的内心表达是:“至少有一个字母字符,然后至少有一个数字字符,然后是任何字母数字字符”。这是你的意思吗?如果是这样,你可以缩短一点:[a-z]+[0-9]+[a-z0-9]*

答案 2 :(得分:0)

您可能应该使用标准POSIX函数inet_pton()(替换inet_aton())并处理IPv4和IPv6地址格式。

答案 3 :(得分:-2)

来自Coding Horror

  

有些人在遇到问题时会想“我知道,我会用   正则表达式。“现在他们有   两个问题。

我的意思是:你确定正则表达式是解决问题的最佳方法吗?也许你可以测试字符串是否是一个带有更多lightweigth方法的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;
}