正则表达式检查网址

时间:2018-08-09 11:35:36

标签: c regex

我想使用regex并在c程序中使用它来检查这样的网址:

x://username@ip/directory/filename.txt

它可以是主机名,而不是ip。 x可以是ftp, scp,...之类的东西。

我测试了[a-z_\-\s0-9\.]+)+\.(txt)$的ip或主机名部分和文件名,但是它不起作用!

请帮助我找到正确的正则表达式。

1 个答案:

答案 0 :(得分:0)

这可能是您正在寻找的表达方式

^.+://.+@([^/]+)/.*/(.*\\.txt)$

这是我用来测试正则表达式的代码:

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char sir[] = "ftp://username@ip/directory/filename.txt";
    char msgbuf[100];
    int padding, length;
    char buffer[50];

    regex_t regex;
    int reti;
    size_t nmatch = 4;
    regmatch_t pmatch[4];

    /* Compile regular expression */
    reti = regcomp(&regex, "^.+://.+@([^/]+)/.*/(.*\\.txt)$", REG_EXTENDED);
    if (reti) {
        fprintf(stderr, "Could not compile regex\n");
        exit(1);
    }

    /* Execute regular expression */
    reti = regexec(&regex, sir, nmatch, pmatch, 0);
    if (!reti) 
    {
        length = strlen(sir);
        sprintf(buffer, "%d", length);
        padding = strlen(buffer);
        padding++;
        printf("Index:");
        for(int i = 0; i < length; i++)
            printf("%*d", padding, i);
        printf("\nvalue:");
        for(int i = 0; i < length; i++)
            printf("%*c", padding, sir[i]);
        printf("\n\n");


        printf("%d %d\n", pmatch[0].rm_so, pmatch[0].rm_eo);
        printf("%d %d\n", pmatch[1].rm_so, pmatch[1].rm_eo);
        printf("%d %d\n", pmatch[2].rm_so, pmatch[2].rm_eo);
        printf("%d %d\n", pmatch[3].rm_so, pmatch[3].rm_eo);
    }
    else if (reti == REG_NOMATCH) {
        puts("No match");
    }
    else {
        regerror(reti, &regex, msgbuf, sizeof(msgbuf));
        fprintf(stderr, "Regex match failed: %s\n", msgbuf);
        exit(1);
    }

    /* Free memory allocated to the pattern buffer by regcomp() */
    regfree(&regex);

    return 0;
}

这是它给出的输出:

Index:  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
value:  f  t  p  :  /  /  u  s  e  r  n  a  m  e  @  i  p  /  d  i  r  e  c  t  o  r  y  /  f  i  l  e  n  a  m  e  .  t  x  t


0 40
15 17
28 40
-1 -1

它在pmatch [1]中捕获ip,在pmatch [2]中捕获filename.txt