我怎样才能轻松搞定正则表达式选择用C?(How can I easily get regex sel

2019-09-16 16:29发布

我使用正则表达式regex.h(POSIX)。 有没有在C正则表达式匹配任何选择的方法呢?

我可以很容易地检查正则表达式,但如果我需要检索匹配的价值,我必须手动查找和存储。

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

这正则表达式查找在双大括号的任何变量匹配。 但我只需要在字符串中最核心的项目。 我怎样才能找回在C正则表达式的值?

Answer 1:

你需要在一组通过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;
}


文章来源: How can I easily get regex selections in C?
标签: c regex unix posix