gpt4 book ai didi

c - C 中的正则表达式 - 匹配组

转载 作者:行者123 更新时间:2023-12-05 09:25:17 24 4
gpt4 key购买 nike

我一直在努力使用 C 中的正则表达式(只是 /usr/include/regex.h)。


我有(比方说)数百个正则表达式,其中一个可以匹配输入字符串。目前我正在这样做(实际上生成它)是这样的:数百个 do-while 里面有匹配项,如果不匹配则中断并转到另一个。一个接一个:

do {
if ( regex_match(str, my_regex1) != MY_REGEX_SUCCESS ) DO_FAIL; //break
...
if ( sscanf(str, " %d.%d.%d.%d / %d ", &___ip1, &___ip2, &___ip3, &___ip4, &___pref) != 5 ) DO_FAIL; //break
...
} while (0);

do {
if ( regex_match(str, my_regex2) != MY_REGEX_SUCCESS ) DO_FAIL; //break
...
...
} while (0);

do {
if ( regex_match(str, my_regex3) != MY_REGEX_SUCCESS ) DO_FAIL; //break
...
...
} while (0);

我想要的是这样的:

const char * match1 = "^([[:space:]]*)([$]([._a-zA-Z0-9-]{0,118})?[._a-zA-Z0-9])([[:space:]]*)$";
const char * match2 = "^([[:space:]]*)(target|origin)([[:space:]]*):([[:space:]]*)([$]([._a-zA-Z0-9-]{0,118})?[._a-zA-Z0-9])([[:space:]]*):([[:space:]]*)\\*([[:space:]]*)$";
const char * match3 = "^([[:space:]]*)(target|origin)([[:space:]]*):([[:space:]]*)([$]([._a-zA-Z0-9-]{0,118})?[._a-zA-Z0-9])([[:space:]]*)/([[:space:]]*)(([0-2]?[0-9])|(3[0-2]))([[:space:]]*):([[:space:]]*)(([1-9][0-9]{0,3})|([1-5][0-9]{4})|(6[0-4][0-9]{3})|(65[0-4][0-9]{2})|(655[0-2][0-9])|(6553[0-5]))([[:space:]]*)$";
char * my_match;
asprintf(&my_match, "(%s)|(%s)|(%s)", match1, match2, match3);


int num_gr = give_me_number_of_regex_group(str, my_match)
switch (num_gr) {
...
}

并且不知道该怎么做......

有什么建议吗?
谢谢!

最佳答案

我假设您的 regex_matchregcomp 的某种组合和 regexec。要启用分组,您需要使用 REG_EXTENDED 标志调用 regcomp,但没有 REG_NOSUB 标志(在第三个参数中)。

regex_t compiled;
regcomp(&compiled, "(match1)|(match2)|(match3)", REG_EXTENDED);

然后为组分配空间。组数存储在 compiled.re_nsub 中。将此数字传递给 regexec:

size_t ngroups = compiled.re_nsub + 1;
regmatch_t *groups = malloc(ngroups * sizeof(regmatch_t));
regexec(&compiled, str, ngroups, groups, 0);

现在,第一个无效组是在其 rm_sorm_eo 字段中都具有 -1 值的组:

size_t nmatched;
for (nmatched = 0; nmatched < ngroups; nmatched++)
if (groups[nmatched].rm_so == (size_t)(-1))
break;

nmatched 是匹配的带括号的子表达式(组)的数量。添加您自己的错误检查。

关于c - C 中的正则表达式 - 匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4604522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com