1

我只需要提取 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

4

1 回答 1

2

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

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

一个解释:

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

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

于 2010-11-09T14:37:19.927 回答