- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 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(®exp_data, pattern_str, REG_NEWLINE) == 0) &&
(regexec(®exp_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(®exp_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(®exp_data, pattern_str, REG_EXTENDED | REG_NEWLINE) != 0) {
printf("Couldn't compile.\n");
return 1;
}
while (regexec(®exp_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(®exp_data);
}
关于c - regexec在c中获取xml标签的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133979/
给定一个具有以下结构的二进制文件 unsigned int number1; unsigned int num_rec; acct_info_t acct[num_rec]; acct_info_t
这是我第一次真正尝试使用 C 和正则表达式,所以请耐心等待...我有一个模式数组 (shortener_patterns),其中我将其连同要编译的计数和数组一起传递给 compile_patterns
我遇到了一个问题,其中我的 regexec 代码返回的结果与 Java 代码不同。我使用了相同的正则表达式,但在 c++/c 中返回不同。 这是我的代码片段: const char *pattern
我正在尝试使用以下正则表达式匹配“sdb-iof-pool 1008.56M 884K”等字符串:^(.*)([\s]+)([-+]?[0-9 ]*\.?[0-9]+)([K|M|G|T|P]{1})
我正在实现一个“银行”软件,在创建新用户时必须采用可接受的用户名、密码和余额。 BANK: create-user bob 1234 11111 这是正确输入的示例 BANK: create-user
我需要检查月份是否为 01-12 的形式。我制作了一个正则表达式并输入以检查它是否与正则表达式匹配。代码- #include #include using namespace std; #inclu
我试图在一个大的内存映射文件中找到一个正则表达式通过使用 regexec() 函数。我发现程序崩溃时文件大小是页面大小的倍数。 是否有一个regexec() 函数,它具有字符串的长度作为附加参数? 或
我试图在一个大的内存映射文件中找到一个正则表达式通过使用 regexec() 函数。我发现程序崩溃时文件大小是页面大小的倍数。 是否有一个regexec() 函数,它具有字符串的长度作为附加参数? 或
在以下过于简化的代码示例中: reg = "^[0-9]{1,10}$"; str = "123abc"; regcomp(&re, reg, REG_EXTENDED); regexec(&re,
我有一个像 051916.000 这样的输入字符串。我想隔离 05、19、16 和 000。我正在尝试以这种方式在 C 语言中使用 regexec。 regex_t r; regmatch_t pma
我有一个模式 "^\+?\d{3,20}$" 对“123455”、“+123445”进行测试,预期匹配。 测试“123+213”、“abc”,预计不会匹配。 此模式适用于 pcre_exec(),但不
我正在尝试创建一个正则表达式来评估以下划线开头的数字序列,如下所示:_201312我对数字部分有疑问;我总是收到 REG_NOMATCH 消息。这是代码: #include int result_e
谁能告诉我使用哪个库来利用 regexec()、regfree() 和 regcomp() 函数?我知道它们是在 regex.h 头文件中定义的,但即使在包含头文件之后,当我尝试在 HP-UX 中编译
正则表达式模式需要匹配以下内容: abc_xyz_0 abc_1025_01.29.00_xyz_0 abc_0302_42.01.00_xyz_0 (abc 和 xyz 之间的数字无关紧要) 所以我
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression
有没有办法拿到libc6的正则表达式函数 regcomp和 regexec使用多字节字符正常工作? 例如,如果我的模式是 utf8 字符 猫机+猫 , 在 utf8 编码字符串上找到匹配项 猫机机机猫
这个问题已经有答案了: Why is the following regex not working in C using regcomp (2 个回答) 已关闭 3 年前。 这是我的代码: #inc
我有以下脚本,它解析进程内存以查找字符串匹配,一切正常,但转储编辑器(在本例中为纳米)的进程与 1193 可能的匹配(如果我转储内存,然后对其执行egrep),但我的代码仅输出 3 匹配项。有什么想法
我正在尝试检查字符串是否为有效数字。有效数字类似于 123 或 123.456。我尝试使用 [0-9]+(\\.[0-9]+)? 进行匹配,但这不起作用。 这是我目前所拥有的。 #include #
我有这个代码: char *buffer = calloc(400, sizeof(char)); // buffer gets assigned a string through fgets if
我是一名优秀的程序员,十分优秀!