challenge 文字列からの情報抽出

与えられた文字列から特定の条件を満たす文字列を抽出するコードを書いてください。 状況としてはテキスト形式で渡された原稿の中から、画像のファイル名を抽出するようなものをイメージしてください。

サンプル入力

aaa abc-hidden.png>hoge-big.jpeg
---foo-hidden-small.gif|^_^a.bmp
--hiddena-hoge.png<=not hidden~~
--small.jpg<=not small(^_^)
normal-small-big.hoge

サンプル出力

name:'abc', ext:'png', size: normal hidden: True
name:'hoge', ext:'jpeg', size: big hidden: False
name:'foo', ext:'gif', size: small hidden: True
name:'a', ext:'bmp', size: normal hidden: False
name:'hoge', ext:'png', size: normal hidden: False
name:'small', ext:'jpg', size: normal hidden: False
name:'small', ext:'hoge', size: big hidden: False

探すべき文字列は下の条件を満たします

  • アルファベットと1個のピリオド、ハイフンで構成される
  • 前後にはアルファベットではない文字がある(abcd.jpgがaaaabcd.jpghogeなどと書かれていることはない)
  • ピリオドの後ろは拡張子で、アルファベットだけで構成されている
  • ピリオドの直前に-hidden, -small, -bigがある場合には特殊な意味がある。複数個ある場合(a-hidden-big.jpgなど)も同じ
  • ファイル名に-hiddenと-smallまたは-hiddenと-bigの両方が含まれる場合は-hiddenの方が先にある
  • 特殊な意味の-hidden, -small, -big以外でハイフンが使われることはない
  • 特殊な意味の-smallと-bigの両方が付くことはない

出力は以下の条件を満たす必要があります

  • ファイル名が出現した順に表示される
  • ファイル名に-hiddenが含まれるかどうかを真偽値で表示する
  • ファイル名に-smallまたは-bigが含まれる場合はsmallまたはbigと、含まれない場合はnormalと表示する
  • -hidden, -small, -bigを取り除いたファイル名部分と、拡張子を表示する

このお題は、正規表現のグループに名前をつけて連想配列として取得できるPythonからの挑戦状です。

Posted feedbacks - C

ふつーに regex を使いました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

int main(int argc, char *argv[])
{
    int i, n=6, hidden, size, ext;
    regex_t reg;
    regmatch_t rm[n];
    char* str = \
        "aaa abc-hidden.png>hoge-big.jpeg\n" \
        "---foo-hidden-small.gif|^_^a.bmp\n" \
        "--hiddena-hoge.png<=not hidden~~\n" \
        "--small.jpg<=not small(^_^)\n" \
        "normal-small-big.hoge\n";

    memset(rm, 0, sizeof(regmatch_t) * n);
    regcomp(&reg,"([[:alnum:]]+)(-hidden)?(-(big|small))?(\\.[[:alnum:]]+)",
            REG_EXTENDED);
    while(!regexec(&reg, str, n, rm, 0)){
        hidden = size = ext = 0;
        for(i=1; i<n; i++){
            if(rm[i].rm_so < 0) continue;
            if(str[rm[i].rm_so] == '.') ext = i;
            if(!memcmp("-hidden", str +  rm[i].rm_so, 7)) hidden = 1;
            if(!memcmp("-big", str +  rm[i].rm_so, 4)) size = 1;
            if(!memcmp("-small", str +  rm[i].rm_so, 6)) size = -1;
        }
        fprintf(stdout, "name:\'");
        fwrite(str + rm[1].rm_so, rm[1].rm_eo - rm[1].rm_so, 1, stdout);
        fprintf(stdout, "\', ext:\'");
        fwrite(str + rm[ext].rm_so + 1, rm[ext].rm_eo - rm[ext].rm_so - 1, 1, stdout);  
        fprintf(stdout, "\', size: %s hidden: %s\n",
                size?((size+1)?"big":"small"):"normal", hidden?"True":"False");
        str += rm[0].rm_eo + 1;
    }
    regfree(&reg);
    return EXIT_SUCCESS;
}

Index

Feed

Other

Link

Pathtraq

loading...