2015-12-30 2 views
-2

Я хочу извлечь только строки между <AAA> and </AAA>
как я могу их извлечь? пожалуйста, помогите Пример: <AAA>hello world</AAA> this is a text <AAA>this is another text</AAA> Результат: привет мир это другой текстКак найти текст между двумя конкретными строками в c

+2

Вы хотите написать XML-парсер? – Rabbid76

+1

ну, вероятно, вам, вероятно, придется писать собственный синтаксический анализатор текста, но это действительно зависит от тегов. Например, C имеет синтаксический анализатор для html5, и я уверен, что синтаксический анализатор xml можно найти, но если ваш текст не является допустимым xml ot html, вам, скорее всего, придется написать собственный парсер/ –

+0

извините, позвольте мне сказать ясно – Erfan

ответ

0

Если ваши потребности разборе достаточно велики, вы можете посмотреть на разборе библиотеки, как 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; 
} 

стандартный вывод: 'привет мир'

или даже лучше (нет необходимости таНос):

#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; 
} 

https://ideone.com/cbuDgn

+0

благодарит за вашу помощь. очень ценю :-) – Erfan

2

Выполните следующие действия:

  • Прочитайте весь файл в массиве char, перераспределив этот массив, если необходимо, null завершите работу массива.

  • Используйте strstr(), чтобы найти нахождение "<AAA>". сохранить позицию, если она найдена, если нет.

  • С этой позиции используйте strstr, чтобы найти "</AAA>".

  • вывод текста между ними и перезапуск.

0

Вы можете использовать библиотеки XML для разбора текста, я Recommand с помощью libexpat или libxml2 или minixml, более легче анализировать XML документ с этими библиотеками

Например, для minixml (из официальной документации minixml):

Загрузка XML

Вы загружаете файл XML с помощью функции mxmlLoadFile:

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. 
+0

Спасибо за ваш ответ и рекомендацию :-) – Erfan

0

Вот мой код:

#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; 
} 
+0

Спасибо за вашу помощь и поддержку :-) !! – Erfan

0

Как уже было сказано выше, это выглядит как XML-парсера вам друга, см предложил библиотеки для XML-анализа. Если каким-то чудом XML-парсер не сможет проанализировать ваш текст, потому что он не является допустимым XML, вы можете попробовать и использовать HTML-парсер (например, gumbo-query или любой другой, который вы можете найти). Если HTML-парсер не работает, вам, скорее всего, придется написать собственный текстовый синтаксический анализатор. Это может быть уменьшено, потому что на самом деле он не отвечает на вопрос, но я думаю, что во всех других ответах нет хотя бы предложения о том, что попробовать, если XML-парсеры и XML-подобные парсеры не работают.

+0

ничего себе! Большое спасибо. да, это то, чего я хочу, очень ценный. Это казалось более логичным способом – Erfan

Смежные вопросы