1

次の URI が与えられた場合、URI の 2 番目のパス セグメントのみを抽出する必要があります。

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

second正規表現はURI から文字列を抽出する必要があります。ソリューションの正規表現の説明をいただければ幸いです。

POSIX 準拠の正規表現ライブラリを使用しています。

編集: ガンボによって与えられた解決策は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 パスだけを持っている場合は、次の正規表現でそれを行う必要があります。

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

説明:

  • ^/文字列の先頭とそれに続くリテラルに一致します/
  • [^/]+/を除く 1 つ以上の文字に一致/し、その後にリテラルが続きます/
  • ([^/]*)を除く 0 個以上の文字に一致します/

次に、2 番目のパス セグメントが最初のグループと照合されます。1 番目と 2 番目に使用+したのは、1*番目もゼロ長を許可する場合、絶対パスではなくスキームのない URI になるためです。

于 2010-11-09T14:37:19.927 に答える