2010-11-09 4 views
1

мне нужно извлечь только второй путь сегмент URI, т.е. заданного следующую URI:Что такое регулярное выражение для извлечения второго сегмента пути URI?

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

регулярное выражение должно извлечь second строки из URI. Было бы полезно оценить объяснение решения regex.

Я использую библиотеку регулярных выражений POSIX.

EDIT: Решение дается 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 также.

+2

Эти части называются * сегментами пути *. – Gumbo

+0

@Gumbo - Спасибо. Отредактировал вопрос –

+0

Жалоба? Разве вы не имеете в виду * совместимость *? Но совместим с POSIX BRE или POSIX ERE? – Gumbo

ответ

2

Если вы только имея абсолютный путь URI, то это регулярное выражение следует сделать это:

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

Объяснение:

  • ^/ соответствует началу строки с последующим а именно: /
  • [^/]+/ соответствует одному или нескольким символам кроме / актеры, а затем буквального /
  • ([^/]*) соответствует нулю или более символов, за исключением /.

Второй сегмент пути затем сопоставляется первой группе. Я использовал + для первого и * для второго, потому что если первый также разрешил бы нулевую длину, это не был бы абсолютный путь больше, чем URI без схемы.

+0

Он также попросил объяснения – Samuel

+0

Вот объяснение: http://www.regular-expressions.info/reference.html – Brad

+0

Ваше решение работает с RETester, но не с кодом выше (см. Вопрос) –