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

标签 c regex xml

我正在尝试通过 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/

相关文章:

regex - 在 Notepad++ 中复制一行文本?

java - 无法在 Java 中检索 xml 信息

c - 尝试复制有关可变参数的 printf 行为

c - 元素没有被弹出

c - 调试代码将我带到 stdio.h lib

java - 正则表达式 - 使用正则表达式在另一个字符串中搜索特定字符串

c++ - cvLoadImage 函数中的内存泄漏

regex - 匹配括号之间的语法高亮

xml - 使用批处理文件编辑 XML

javascript - 如何根据属性值在表中显示信息 (XML-XSLT)