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

How to find text between two specific strings in c

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

如果你的解析需求足够大,你可以寻找解析库,比如libxml. Otherwise 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] = '[=10=]';
    printf("'%s'\n", res);
    return 0;
}

标准输出: 'hello world'

甚至更好(不需要 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

按照以下步骤操作:

  • 将整个文件读入一个char数组,如果需要重新分配这个数组,null终止数组。

  • 使用 strstr() 查找出现的 "<AAA>"。如果找到就保存位置,如果没有就完成。

  • 从那个位置,使用strstr找到"</AAA>"

  • 输出中间的文字并重启

您可以使用 XML 库来解析您的文本,我建议使用 libexpat or libxml2 or 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

Return 值

    Character value or -1 on error

讨论

The entity name can also be a numeric constant. -1 is returned if the name is not known.

这是我的代码:

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

int main(int argc, const char *argv[]) {
    const char *srcStr = "<AAA>hello world</AAA> this is a text <AAA>this is another text</AAA>";
    const char *firstDelim = "<AAA>";
    const char *lastDelim = "</AAA>";
    char extStr[128] = "";
    int srcStrLen, firstDelimLen, lastDelimLen;
    int i, catIdx = 0;

    srcStrLen = strlen(srcStr);
    firstDelimLen = strlen(firstDelim);
    lastDelimLen = strlen(lastDelim);

    for (i=0; i<srcStrLen; i++){
        if (strncmp(&srcStr[i], firstDelim, firstDelimLen) == 0) {
            i += firstDelimLen;
            catIdx = i;
        }
        else if (strncmp(&srcStr[i], lastDelim, lastDelimLen) == 0) {
            strncat(extStr, &srcStr[catIdx], i - catIdx);
            i += lastDelimLen;
            if (i != srcStrLen){
                strcat(extStr, " ");
            }
        }
    }
    printf("%s\n", extStr);
    return 0;
}

正如上面所说,XML-parser 是你的朋友,请参阅 XML-parsing 的建议库。如果由于某种奇迹 XML-parser 无法解析您的文本,因为它不是有效的 XML,您可以尝试使用 HTML-parser(例如 gumbo-query,或任何其他你可以找到)。如果 HTML-parser 不起作用,那么您很可能必须编写自己的 text-parser。这可能被低估了,因为它并没有真正回答这个问题,但我认为所有其他答案至少缺乏关于如果 XML-parsers 和 XML-like 解析器不起作用时应该尝试什么的建议。