如何在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;
}
按照以下步骤操作:
将整个文件读入一个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 解析器不起作用时应该尝试什么的建议。
我只想提取 <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;
}
按照以下步骤操作:
将整个文件读入一个
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 解析器不起作用时应该尝试什么的建议。