2014-07-11 10 views
-1

c에서 2 개의 문자열 패턴 사이의 텍스트를 추출해야합니다.두 문자열 사이의 텍스트를 찾는 방법

예 :

aaaaaa<BBBB>TEXT TO EXTRACT</BBBB>aaaaaaaaa 

PATTERN1=<BBBB> 
PATTERN2=</BBBB> 

감사합니다.

+1

정규식 라이브러리를 사용할 수 있습니까? – Jonny

+0

@Jonny 정규 표현식 라이브러리를 사용할 수 있습니다. –

+0

실제로 그것을 무시하고'strstr'을 사용하십시오. 정규 표현식과 XML은 기껏해야 까다 롭습니다. – Jonny

답변

1

이 출력은

인이

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

int main(void) 
{ 
    const char *s = "aaaaaa<BBBB>TEXT TO EXTRACT</BBBB>aaaaaaaaa"; 

    const char *PATTERN1 = "<BBBB>"; 
    const char *PATTERN2 = "</BBBB>"; 

    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 
4

그냥 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을 반환합니다. }

이것은 성능면에서는 최적이 아니지만 구현, 이해, 이해 및 이해 모두 매우 간단합니다.

-2
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 : 나는 여기

+0

오류 : 함수에 대한 인수가 너무 적음 âcallocâ –

+0

@ call34()의 잘못된 사용, 불필요한 캐스트, 정의되지 않은 동작을 발생시키는 0 종료 자 등 ... –

+1

@ user3477950에 의해 설명 된 이유로 -1 이것은'PATTERN2'가 발견되면'PATTERN1' 다음에 온다고 가정합니다. 그것은 다소 사납다. – unwind