c에서 2 개의 문자열 패턴 사이의 텍스트를 추출해야합니다.두 문자열 사이의 텍스트를 찾는 방법
예 :
aaaaaa<BBBB>TEXT TO EXTRACT</BBBB>aaaaaaaaa
PATTERN1=<BBBB>
PATTERN2=</BBBB>
감사합니다.
c에서 2 개의 문자열 패턴 사이의 텍스트를 추출해야합니다.두 문자열 사이의 텍스트를 찾는 방법
예 :
aaaaaa<BBBB>TEXT TO EXTRACT</BBBB>aaaaaaaaa
PATTERN1=<BBBB>
PATTERN2=</BBBB>
감사합니다.
이 출력은
인이#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
그냥 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 : 나는 여기
오류 : 함수에 대한 인수가 너무 적음 âcallocâ –
@ call34()의 잘못된 사용, 불필요한 캐스트, 정의되지 않은 동작을 발생시키는 0 종료 자 등 ... –
@ user3477950에 의해 설명 된 이유로 -1 이것은'PATTERN2'가 발견되면'PATTERN1' 다음에 온다고 가정합니다. 그것은 다소 사납다. – unwind
정규식 라이브러리를 사용할 수 있습니까? – Jonny
@Jonny 정규 표현식 라이브러리를 사용할 수 있습니다. –
실제로 그것을 무시하고'strstr'을 사용하십시오. 정규 표현식과 XML은 기껏해야 까다 롭습니다. – Jonny