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

问题描述:

我想仅提取<AAA> and </AAA>之间的字符串
我该如何提取这些? 请帮助 例子: <AAA>hello world</AAA> this is a text <AAA>this is another text</AAA> 结果: 的Hello World 这是另一个文本如何在两个特定的字符串之间找到文本c

+2

你想写一个XML解析器吗? – Rabbid76

+1

以及你可能必须编写自己的文本解析器,但它确实取决于标签。例如C有HTML5的解析器,并且我确信可以找到xml解析器,但是如果您的文本不是有效的xml或html,则必须编写自己的解析器,最有可能/ –

+0

对不起,让我说清楚 – Erfan

如果你的分析需求是足够大的,你可以找解析库,像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; 
} 

标准输出: '世界你好'

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

+0

感谢您的帮助。非常感谢:-) – Erfan

遵循以下步骤:

  • 将整个文件读取到一个char数组中,如果需要重新分配此数组,则null终止数组。使用strstr()发现"<AAA>"的发生。如果找到则保存位置,否则保存位置。

  • 从该位置开始,使用strstr找到"</AAA>"

  • 输出中间的文本并重新启动。

您可以使用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. 
+0

感谢您的回答和建议:-) – Erfan

这里是我的代码:

#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; 
} 
+0

感谢您的帮助和支持:-)! – Erfan

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

+0

哇!非常感谢你。是的,这就是我想要的,非常感谢这似乎更合乎逻辑的方式 – Erfan