4

正規表現にはregex.h ( POSIX ) を使用しています。Cで正規表現一致の選択方法はありますか?

正規表現は非常に簡単に確認できますが、一致した値を取得する必要がある場合は、手動で検索して保存する必要があります。

{{( )*(([[:alnum:]]+\\.)*)?[[:alnum:]]+( )*}}

この正規表現は、二重中括弧で一致する変数を探します。しかし、文字列の最も中心的な項目だけが必要です。Cで正規表現を使用して値を取得するにはどうすればよいですか?

4

1 に答える 1

4

regmatch_t正規表現が一致のインデックスで埋めることができる一連のsを渡す必要があります。単一のコマンドライン引数(テストする文字列)を使用して、以下のプログラムを試してください。

一致のインデックスができたら、探しているものを簡単に引き出すことができます。(注:matches[0]式全体が一致するため、部分式はで始まりmatches[1]ます。)

#include <stdlib.h>
#include <stdio.h>
#include <regex.h>

int main(int argc, char* argv[])
{
    const char* pattern = "{{( )*(([[:alnum:]]+\\.)*)?[[:alnum:]]+( )*}}";
    regex_t rex;
    int rc;

    if ((rc = regcomp(&rex, pattern, REG_EXTENDED))) {
        fprintf(stderr, "error %d compiling regex\n", rc);
        /* retrieve error here with regerror */
        return -1;
    }

    regmatch_t* matches = malloc(sizeof(regex_t) * (rex.re_nsub + 1));

    if ((rc = regexec(&rex, argv[1], rex.re_nsub + 1, matches, 0))){
        printf("no match\n");
        /* error or no match */
    } else {
        for(int i = 0; i < rex.re_nsub; ++i) {
            printf("match %d from index %d to %d: ", i, matches[i].rm_so,
                   matches[i].rm_eo);
            for(int j = matches[i].rm_so; j < matches[i].rm_eo; ++j) {
                printf("%c", argv[1][j]);
            }
            printf("\n");
        }
    }

    free(matches);
    regfree(&rex);

    return 0;
}
于 2012-04-23T16:58:49.860 に答える