gpt4 book ai didi

c - 在 C 中,如何获取捕获组 RegEx?

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:35 26 4
gpt4 key购买 nike

这是我遇到问题的 C 函数:

char get_access_token(char *client_credentials)
{
regex_t regex;
int reti;
char msgbuf[100];
reti = regcomp(&regex, "\\\"access_token\\\".\\\"(.*?)\\\"", 0);

regmatch_t pmatch[1];
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}

reti = regexec(&regex, client_credentials, 1, pmatch, 0);
if (!reti) {
puts("Match");
} else if (reti == REG_NOMATCH) {
puts("No match");
} else {
regerror(reti, &regex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
exit(1);
}

return (char) "";
}

我要解析的字符串是一个 JSON 字符串,我不关心实际结构我只关心访问 token 。

它应该是这样的:


{“access_token”:“blablablabal”}

我希望我的函数只返回“blablablabla”

我尝试使用的正则表达式是这个:

\"access_token"."(.*?)"

但是我在变量 pmatch 中找不到,我只在那个数组中找到两个数字,我真的不知道这些数字是什么意思。

我做错了什么?

附言我是 C 菜鸟,我只是在学习。

最佳答案

有几个问题。您的正则表达式中有拼写错误。并且您正在尝试将扩展的正则表达式功能与 POSIX 正则表达式结合使用。

首先是错别字。

reti = regcomp(&regex, "\\\"access_token\\\".\\\"(.*?)\\\"", 0);
^

应该是:

reti = regcomp(&regex, "\\\"access_token\\\": \\\"(.*?)\\\"", 0);

然后我们不需要在正则表达式中转义引号。这使其更易于阅读。

reti = regcomp(&regex, "\"access_token\": \"(.*?)\"", 0);

这仍然不起作用,因为它使用了基本 POSIX 正则表达式所没有的功能。捕获组必须在基本的 POSIX 正则表达式中转义。这可以通过使用 REG_EXTENDED 来解决。 *? 非贪婪运算符是从 Perl 借来的增强的非 POSIX 功能。您可以使用 REG_ENHANCED 获取它们。

reti = regcomp(&regex, "\"access_token\": \"(.*?)\"", REG_ENHANCED|REG_EXTENDED);

但出于同样的原因,不要尝试使用正则表达式解析 JSON we don't parse HTML with a regex .使用 JSON 库,例如 json-glib .

关于c - 在 C 中,如何获取捕获组 RegEx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52129581/

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