提取URI的第二个路径段的正则表达式是什么?

时间:2010-11-09 14:34:10

标签: c regex posix-ere

我只需要提取URI的第二个路径段,即给出以下URI:

/first/second/third/fourth/...

正则表达式应该从URI中提取second字符串。对解决方案正则表达式的解释将不胜感激。

我正在使用POSIX投诉正则表达式库。

修改 Gumbo提供的解决方案适用于REtester

但是,它似乎不适用于以下代码:

#include "regex.h"
char *regexp (const char *string, const char *patrn, int *begin, int *end){     
        int i, w=0, len;                  
        char *word = NULL;
        regex_t rgT;
        regmatch_t match;
        wsregcomp(&rgT,patrn,REG_EXTENDED);
        if ((wsregexec(&rgT,string,1,&match,0)) == 0) {
                *begin = (int)match.rm_so;
                *end = (int)match.rm_eo;
                len = *end-*begin;
                word = (char*) malloc(len+1);
                for (i=*begin; i<*end; i++) {
                        word[w] = string[i];
                        w++; }
                word[w]=0;
        }
        wsregfree(&rgT);
        return word;
}

int main(){
    int begin = 0;
    int end = 0;

    char *word = regexp("/first/second/third","^/[^/]+/([^/]*)",&begin,&end);
    printf("ENV %s\n",word);
}

以上内容仅打印/first/second而不是second

EDIT2:java.util.regex的结果相同。

1 个答案:

答案 0 :(得分:2)

如果您只是拥有绝对URI路径,那么这个正则表达式应该这样做:

^/[^/]+/([^/]*)

解释:

  • ^/ 匹配字符串的开头,后跟文字/
  • [^/]+/ 匹配除/以外的一个或多个字符,后跟文字/
  • ([^/]*) 匹配除/以外的零个或多个字符。

然后第二个路径段由第一个组匹配。我使用+作为第一个,*作为第二个,因为如果第一个也允许零长度,它将不再是绝对路径,而是无方案URI。