如何在两个特定的字符串之间找到文本c
我想仅提取<AAA> and </AAA>
之间的字符串
我该如何提取这些? 请帮助 例子: <AAA>hello world</AAA>
this is a text
<AAA>this is another text</AAA>
结果: 的Hello World 这是另一个文本如何在两个特定的字符串之间找到文本c
如果你的分析需求是足够大的,你可以找解析库,像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;
}
感谢您的帮助。非常感谢:-) – Erfan
遵循以下步骤:
将整个文件读取到一个
char
数组中,如果需要重新分配此数组,则null终止数组。使用strstr()
发现"<AAA>"
的发生。如果找到则保存位置,否则保存位置。从该位置开始,使用
strstr
找到"</AAA>"
。输出中间的文本并重新启动。
您可以使用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.
感谢您的回答和建议:-) – 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;
}
感谢您的帮助和支持:-)! – Erfan
正如有人说上面它看起来像XML分析器是你的朋友,请参阅建议XML的解析库。如果由于某种奇迹,XML解析器无法解析文本,因为它不是有效的XML,您可以尝试使用HTML解析器(例如gumbo-query或任何其他可找到的解析器)。如果HTML解析器不起作用,那么您很可能必须编写自己的文本解析器。这可能是被低估的,因为它没有真正回答这个问题,但我认为如果XML解析器和类似XML的解析器不工作,所有其他答案都至少缺少尝试尝试的建议。
哇!非常感谢你。是的,这就是我想要的,非常感谢这似乎更合乎逻辑的方式 – Erfan
你想写一个XML解析器吗? – Rabbid76
以及你可能必须编写自己的文本解析器,但它确实取决于标签。例如C有HTML5的解析器,并且我确信可以找到xml解析器,但是如果您的文本不是有效的xml或html,则必须编写自己的解析器,最有可能/ –
对不起,让我说清楚 – Erfan