如何在c中找到两个字符串之间的文本
我需要在c中提取2个字符串模式之间的文本。
例:
aaaaaaTEXT TO EXTRACTaaaaaaaaa PATTERN1= PATTERN2=
谢谢。
这是一个如何做到这一点的活生生的例子
#include #include int main(void) { const char *s = "aaaaaaTEXT TO EXTRACT aaaaaaaaa"; const char *PATTERN1 = ""; const char *PATTERN2 = " "; char *target = NULL; char *start, *end; if ( start = strstr( s, PATTERN1 ) ) { start += strlen( PATTERN1 ); if ( end = strstr( start, PATTERN2 ) ) { target = ( char * )malloc( end - start + 1 ); memcpy( target, start, end - start ); target[end - start] = '\0'; } } if ( target ) printf( "%s\n", target ); free( target ); return 0; }
输出是
TEXT TO EXTRACT
只需使用strstr()
。
首先找到开始标记,然后使用指向开始标记后第一个字符的指针再次调用它,以找到结束标记:
char * extract_between(const char *str, const char *p1, const char *p2) { const char *i1 = strstr(str, p1); if(i1 != NULL) { const size_t pl1 = strlen(p1); const char *i2 = strstr(i1 + pl1, p2); if(p2 != NULL) { /* Found both markers, extract text. */ const size_t mlen = i2 - (i1 + pl1); char *ret = malloc(mlen + 1); if(ret != NULL) { memcpy(ret, i1 + pl1, mlen); ret[mlen] = '\0'; return ret; } } }
请仔细测试上面的内容,我写得很快。 返回NULL; }
这可能不是性能上的最佳,但对于实现,正确,阅读和理解都非常简单。
char * start = strstr(PATTERN1, text); char * end = strstr(PATTERN2, text); if (end == NULL || start == NULL) return; *end = '\0'; printf("%s\n", start);
注意:如果您无法修改原始字符串,请将其复制到您可以使用的缓冲区中。
替代版本:
char * start = strstr(PATTERN1, text); char * end = strstr(PATTERN2, text); if (end == NULL || start == NULL) return; int len = end - start; if (len <= 0) return; char * parsed = (char *)calloc(len+1, sizeof(char)); if (parsed == NULL) return; memcpy(parsed, start, len); printf("%s\n", parsed); free(parsed);
ps:我还没有测试过任何代码