我想只提取<AAA> and </AAA>
之间的字符串
我怎么能提取那些?
请帮忙
示例:
<AAA>hello world</AAA>
this is a text
<AAA>this is another text</AAA>
结果:
你好,世界
这是另一个文本
答案 0 :(得分:2)
请按照以下步骤操作:
将整个文件读入char
数组,如果需要,重新分配此数组,null终止数组。
使用strstr()
查找"<AAA>"
的匹配项。如果找到则保存位置,如果没有则保存。
从该位置,使用strstr
查找"</AAA>"
。
在两者之间输出文本并重新启动。
答案 1 :(得分:0)
如果您的解析需求足够大,您可能会寻找解析库,例如libxml。否则strstr是你的朋友:
#include <stdio.h>
#include <stdlib.h>
int main() {
char *res;
size_t len;
const char *p1, *p2;
char text[] = "<AAA>hello world</AAA>";
p1 = strstr(text, "<AAA>");
if (p1 == NULL) return -1;
p1 += 5;
p2 = strstr(p1, "</AAA>");
if (p2 == NULL) return -2;
len = p2 - p1;
res = malloc(len + 1);
if (res == NULL) return -3;
strncpy(res, p1, len);
res[len] = '\0';
printf("'%s'\n", res);
return 0;
}
标准输出: &#39;你好世界&#39;
甚至更好(不需要malloc):
#include <stdio.h>
int main() {
const char *p1, *p2;
char text[] = "<AAA>hello world</AAA>";
p1 = strstr(text, "<AAA>");
if (p1 == NULL) return -1;
p1 += 5;
p2 = strstr(p1, "</AAA>");
if (p2 == NULL) return -2;
printf("'%.*s'\n", (int)(p2 - p1), p1);
return 0;
}
答案 2 :(得分:0)
您可以使用XML库来解析文本,我建议使用libexpat或libxml2或minixml,使用这些库解析XML文档会更容易
例如minixml(来自minixml的官方文档):
加载XML
使用mxmlLoadFile函数加载XML文件:
FILE *fp;
mxml_node_t *tree;
fp = fopen("filename.xml", "r");
tree = mxmlLoadFile(NULL, fp,
MXML_TEXT_CALLBACK);
fclose(fp);
<强> mxmlEntityGetValue 强>
获取与命名实体对应的字符。
int mxmlEntityGetValue (
const char *name
);
<强>参数强>
name
Entity name
返回值
Character value or -1 on error
讨论
The entity name can also be a numeric constant. -1 is returned if the name is not known.
答案 3 :(得分:0)
这是我的代码:
[vagrant@vm1-berkshelf ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案 4 :(得分:0)
如上所述,看起来XML-parser是你的朋友,请参阅建议的XML解析库。如果由某些奇迹XML解析器无法解析您的文本,因为它不是有效的XML,您可以尝试使用HTML解析器(例如gumbo-query,或任何其他您可以找到的)。如果HTML解析器不起作用,那么您很可能必须编写自己的文本解析器。这可能是贬低的,因为它并没有真正回答这个问题,但我认为所有其他答案至少缺乏一个建议,即如果XML解析器和类似XML的解析器不起作用,应该尝试什么。