我想使用regex并在c程序中使用它来检查这样的网址:
x://username@ip/directory/filename.txt
它可以是主机名,而不是ip。 x
可以是ftp, scp,...
之类的东西。
我测试了[a-z_\-\s0-9\.]+)+\.(txt)$
的ip或主机名部分和文件名,但是它不起作用!
请帮助我找到正确的正则表达式。
答案 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(®ex, "^.+://.+@([^/]+)/.*/(.*\\.txt)$", REG_EXTENDED);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
/* Execute regular expression */
reti = regexec(®ex, 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, ®ex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
exit(1);
}
/* Free memory allocated to the pattern buffer by regcomp() */
regfree(®ex);
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