1

次の形式のファイルを読み込んでいます。

    /* ...more text above */
    [Text=WORKING CharacterOffsetBegin=73516 CharacterOffsetEnd=73523 PartOfSpeech=VBG                 
    Lemma=work] [Text=MEN CharacterOffsetBegin=73524 CharacterOffsetEnd=73527                    
    PartOfSpeech=NNS Lemma=man] [Text=OF CharacterOffsetBegin=73528
    CharacterOffsetEnd=73530 PartOfSpeech=IN Lemma=of] [Text=ALL
    CharacterOffsetBegin=73531 CharacterOffsetEnd=73534 PartOfSpeech=NN Lemma=all] 
    [Text=COUNTRIES CharacterOffsetBegin=73535 CharacterOffsetEnd=73544 PartOfSpeech=NNS 
    Lemma=country] [Text=, CharacterOffsetBegin=73544 CharacterOffsetEnd=73545
    PartOfSpeech=, Lemma=,] [Text=UNITE CharacterOffsetBegin=73546
    CharacterOffsetEnd=73551 PartOfSpeech=VB Lemma=unite] [Text=!
    CharacterOffsetBegin=73551 CharacterOffsetEnd=73552 PartOfSpeech=. Lemma=!]
    /* ...more text below */

私がしたいのは、 Text=Lemma=で指定された文字列を配列に抽出することです。たとえば、出力の上のテキストは次のようになります。

 WORKING
 work
 MEN
 man
 OF
 of

等々。私が試したこと:

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

#define MAX_LINE 4096

int main()
{
  FILE *fp;
  fp = fopen("moby.txt.out", "r");

  char *linha = malloc(MAX_LINE);
  int s, t;
  char lemma[100];

  while(fgets(linha, MAX_LINE, fp))
  {
    if(sscanf(linha, "Sentence #%d (%d tokens):", &s, &t))
    {
      /*printf("%d\n", t);*/
    }
    else if(sscanf(linha, "Lemma=%s", lemma))
    {
      printf("%s", lemma);
    }
}

fclose(fp);
return 0;
}

外部ライブラリを使用できません。正規表現は C 言語の一部ではないことを知っているので、どんな助けも大歓迎です。

ありがとう!

4

1 に答える 1

8

とにかく、正規表現は必要ありません。いいえscanf()。簡単な解決策は、を使用することstrstr()です。

const char *s = "[Text=WORKING CharacterOffsetBegin=73516 CharacterOffsetEnd=73523 PartOfSpeech=VBG \
    Lemma=work] [Text=MEN CharacterOffsetBegin=73524 CharacterOffsetEnd=73527 \
    PartOfSpeech=NNS Lemma=man]";

const char *p = s;
while ((p = strstr(p, "Text=")) != NULL) {
    p += 5;
    const char *t = strchr(p, ' ');
    printf("%.*s\n", (int)(t - p), p);

    p = strstr(t + 1, "Lemma=") + 6;
    t = strchr(p, ']');
    printf("%.*s\n", (int)(t - p), p);
    p = t + 1;
}
于 2013-05-28T17:49:50.027 に答える