gpt4 book ai didi

c - regexec在c中获取xml标签的值

转载 作者:行者123 更新时间:2023-11-30 16:58:02 25 4
gpt4 key购买 nike

我正在尝试通过 regexec 在 C 编程中获取 xml 标签的值,但我无法使用 xml 解析器。

下面是我的示例代码,有人可以帮助获得预期的输出吗?

char value[500];
regex_t regexp_data;
regmatch_t matched_data[10];
char pattern_str[] = "<CODE[ \t]*^*>[ \t]*\\(.*\\)[ \t]*<\\/CODE[ \t]*>";
char msg_str[] = "<ROOT><INFO><CODE>5001</CODE><MSG>msg one</MSG></INFO> <INFO><CODE>5002</CODE><MSG>msg two</MSG></INFO></ROOT>";

if ((regcomp(&regexp_data, pattern_str, REG_NEWLINE) == 0) &&
(regexec(&regexp_data, msg_str, 10, matched_data, 0) == 0))
{
int i;
for (i=0; i < 10; ++i)
{
memset(value, '\0', sizeof(value));
memcpy(value, &msg_str[matched_data[i].rm_so], (matched_data[i].rm_eo - matched_data[i].rm_so));

printf ("value [%s]\n", value);
}

regfree(&regexp_data);
}

/*----------------------
Outupt
value [<CODE>5001</CODE><MSG>msg one</MSG></INFO><INFO><CODE>5002</CODE>]
value [5001</CODE><MSG>msg one</MSG></INFO><INFO><CODE>5002]
----------------------
Expected Outupt
value [5001]
value [5002]
----------------------*/

最佳答案

根据 Wiktor 的评论,.*太贪心了,所以我将正则表达式更新为 "<CODE[ \t]*>\\s*([0-9]*)\\s*<\\/CODE[ \t]*>"并传入REG_EXTENDED标记以避免必须转义括号。

对于捕获多个匹配项,您需要遵循 Wiktor 链接的要点如何捕获多个匹配项。为了获得每个匹配项,您必须对字符串多次调用 regexec,同时将指向源字符串的指针前进整个匹配项的长度。匹配数组中的第一个数组元素是整个匹配,而后续元素是捕获的组。由于您只有一个捕获的组,因此您只需传入 2 的大小,而不是 10。这是我使用的完整代码:

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

int main() {
char value[500];
regex_t regexp_data;
regmatch_t matched_data[2];
char pattern_str[] = "<CODE[ \t]*>\\s*([0-9]*)\\s*<\\/CODE[ \t]*>";
char msg_str[] = "<ROOT><INFO><CODE>5001</CODE><MSG>msg one</MSG></INFO><INFO><CODE>5002</CODE><MSG>msg two</MSG></INFO></ROOT>";
char *cursor = msg_str;

if (regcomp(&regexp_data, pattern_str, REG_EXTENDED | REG_NEWLINE) != 0) {
printf("Couldn't compile.\n");
return 1;
}

while (regexec(&regexp_data, cursor, 2, matched_data, 0) != REG_NOMATCH) {
memset(value, '\0', sizeof(value));
memcpy(value, cursor + matched_data[1].rm_so, (matched_data[1].rm_eo - matched_data[1].rm_so));
printf("value [%s]\n", value);
cursor += matched_data[0].rm_eo;
}

regfree(&regexp_data);
}

关于c - regexec在c中获取xml标签的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133979/

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