如何在c中的两个特定字符串之间查找文本

时间:2015-12-30 08:24:02

标签: c string c-strings text-extraction

我想只提取<AAA> and </AAA>之间的字符串 我怎么能提取那些? 请帮忙 示例: <AAA>hello world</AAA> this is a text <AAA>this is another text</AAA> 结果: 你好,世界 这是另一个文本

5 个答案:

答案 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;
}

https://ideone.com/cbuDgn

答案 2 :(得分:0)

您可以使用XML库来解析文本,我建议使用libexpatlibxml2minixml,使用这些库解析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的解析器不起作用,应该尝试什么。