[Volgograd] parse file

Serge S. Fukanchik fuxx на mail.ru
Сб Май 3 20:08:43 MSD 2003


Dwarf wrote:
> On Sat, May 03, 2003 at 11:49:10AM +0400, Serge S. Fukanchik wrote:
> 
>>Тебе помогут регулярные выражения
> 
> 
> Фукс, а я не догадался... Каким образом это прописать? Маленький
> пример можешь кинуть?
> 
Такой пойдет?
--
fuxx

----------- следущая часть -----------
#include <unistd.h>
#include <sys/types.h>
#include <regex.h>

#define POS_TIME     1
#define POS_TITLE    2
#define POS_ABSTRACT 3
#define POS_LINK     4

void
fail (int err, regex_t *preg)
{
    char buf[256];

    regerror(err, preg, buf, 255);
    printf("regex error: %s\n", buf);
    exit(-1);
}

char      *rexpr, *rstr;
regex_t    reg;
regmatch_t match[5];

void
reg_init(char *e)
{
    int ret;
    
    rexpr = e;
    ret = regcomp(&reg, rexpr, 0);
    if(ret) fail(ret, &reg);
}

void
reg_match(char *str)
{
    int ret;

    rstr=str;
    ret = regexec(&reg, rstr, 5, match, 0);
    if(ret) fail(ret, &reg);
}

void
reg_free()
{
    regfree(&reg);
}

void
print_match (unsigned int pos, const char *title)
{
    int i;
    
    printf (title);
    if(-1 != match[pos].rm_so)
	for(i = match[pos].rm_so; i < match[pos].rm_eo;++i)
	    printf("%c", rstr[i]);
    putchar ('\n');
}

int main(int argc, char *argv[])
{
    int i;
    char *expr = "\\[\\([0-9]*:[0-9]*\\)\\] \\([^\\.]*.\\)\\(.*\\)\\(http://.*\\)";
    char *str[] = {"[13:54] Новая графическая оболочка для МС_ДОС."
		   "Новинка будет отличатся простым в использовании графическим интерфейсом,"
		   " а также поддержкой многозадачности. http://www.compulenta.ru/2003/4/1/38697/",
		   "[12:46] Революционная операционная система от \"Микрософт\"."
		   "Cистема научилась работать с накопителями на жестких магнитных дисках,"
		   " имеющих значительно больший объем, чем дискеты - до 10 Мб. "
		   "http://www.compulenta.ru/2003/4/1/38709/",
		   "[12:09] В Чикаго создадут общегородскую радиотелефонную сеть."
		   "Со специального радиотелефона можно будет совершать и принимать звонки с любых телефонных номеров,"
		   " в том числе, из других городов и даже стран. http://www.compulenta.ru/2003/4/1/38713/"
    };
    
    reg_init(expr);

    for(i=0; i<sizeof(str)/sizeof(char*);++i) {
	reg_match(str[i]);
    
	print_match(POS_TIME, "Время: ");
	print_match(POS_TITLE, "Название статьи: ");
	print_match(POS_ABSTRACT, "Аннотация: ");
	print_match(POS_LINK, "Ссылка на статью: ");
    }
    reg_free();
    return 0;
}



Подробная информация о списке рассылки Volgograd