Bem vindo ao LifeGames Demo
Cadastre-se agora para ter acesso a todos os nossos recursos. Uma vez cadastrado e logado, você será capaz de criar tópicos, postar respostas a tópicos já existentes, a reputação de seus companheiros, começar seu próprio mensageiro privado, atualizações de status post, gerir o seu perfil e muito mais. Esta mensagem será removida assim que tiver logado.
Entrar Cadastre-se


Você não está conectado. Conecte-se ou registre-se

regex em c

Ver o tópico anterior Ver o tópico seguinte Ir para baixo  Mensagem [Página 1 de 1]

1regex em c Empty regex em c Dom Jun 09, 2013 10:43 am

Moedas Moedas : 201
Mensagens Mensagens : 92
Humor Humor : *-*
Reputação Reputação : 5
Quebra de regras:
regex em c Left_bar_bleue0 / 1000 / 100regex em c Right_bar_bleue

hacker fts315

hacker fts315

Moderador Informática

Moderador Informática

bom galera nesse tutorial vou ensinar o basico de regex em c, se voce usa o sistema windows vai ter q baixar as bibliotecas e libs

[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]

nao vou ensinar como instalar no windows mais e bem facil baixe o executavel e depois configure na opções da sua IDE, nao se esqueça de linkar -l regex, no linux costuma ja vim com elas entao so criar seu codigo ^^ , para começar vamos criar uma source basica tambem declarar a biblioteca regex.h

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
}

criamos uma variavel do tipo regex_t, usamos a funçao regcomp para criar a regex passamos como argumento o endereço de memoria da variavel regex_t, a nossa regex, numero 0

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   regex_t r;
   regcomp(&r,"hacker",0);
}

agora vou criar uma string onde a regex vai fazer a pesquisa

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regcomp(&r,"hacker",0);
}

usamos a funçao regexec passamos como argumento o endereço da variavel regex_t a string q vai ser pesquisada, o numero 0, NULL e o numero 0 denovo

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regcomp(&r,"hacker",0);
   regexec(&r,fts,0,NULL,0);
}

no caso desse exemplo vamos saber se a regex tem na string, usamos a condiçao if com uma negaçao com a funçao regexec

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regcomp(&r,"hacker",0);
   if(!(regexec(&r,fts,0,NULL,0)))
   {
      printf("sim - regex bate");
   }
   else
   {
      printf("nao - regex nao bate");
   }
}

para terminar usamos a funçao regfree para liberar a regex e passamos como argumento para ela o endereço da variavel regex_t

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regcomp(&r,"hacker",0);
   if(!(regexec(&r,fts,0,NULL,0)))
   {
      printf("sim - regex bate");
   }
   else
   {
      printf("nao - regex nao bate");
   }
   regfree(&r);
}

compilamos e executamos ^^ , agora vamos aprender a recorta uma parte do texto para isso vamos usar uma pequena gambiarra aq '-', na funçao regcomp onde e numero 0 usamos a constante REG_EXTENDED

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regcomp(&r,"hacker",REG_EXTENDED);
   regexec(&r,fts,0,NULL,0);
   regfree(&r);
}

agora criamos uma estrutura do tipo regmatch_t e atribuimos o endereço de memoria dela para funçao regexec no lugar de NULL, e o primeiro 0 colocamos o numero 1

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regmath_t rm;
   regcomp(&r,"hacker",REG_EXTENDED);
   regexec(&r,fts,1,&rm,0);
   regfree(&r);
}

a estrutura regmatch_t tem dois atributos q sao rm_so e rm_eo, o atributo rm_so aponta para começo da nossa regex e o rm_eo para o final

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regmatch_t rm;
   regcomp(&r,"hacker",REG_EXTENDED);
   regexec(&r,fts,1,&rm,0);
   printf("comeco: %d\n",rm.rm_so);
   printf("fim: %d",rm.rm_eo);
   regfree(&r);
}

para agente ler da nossa regex para frente basta somar a string ao atributo no caso somando ela ao rm_so ele vai ler a regex e o rm_eo vai ler depois dela

Código:
#include <stdio.h>
#include <regex.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   regex_t r;
   regmatch_t rm;
   regcomp(&r,"hacker",REG_EXTENDED);
   regexec(&r,fts,1,&rm,0);
   printf("comeco: %s\n",fts + rm.rm_so);
   printf("fim: %s",fts + rm.rm_eo);
   regfree(&r);
}

para agente recortar apenas a parte da regex usamos a funçao strncpy da biblioteca string.h q limita a quantidade de caracter copiado (excelente funçao para evitar bunffer overflow), mais ante precisamos criar uma string para receber depois passamos como argumento para funçao strncpy a nova string, a string somada ao atributo rm_so, e rm_eo subtraido pelo rm_so

Código:
#include <stdio.h>
#include <regex.h>
#include <string.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   char hack[100];
   regex_t r;
   regmatch_t rm;
   regcomp(&r,"hacker",REG_EXTENDED);
   regexec(&r,fts,1,&rm,0);
   strncpy(hack,fts + rm.rm_so, rm.rm_eo - rm.rm_so);
   regfree(&r);
}

so para evitar bunffer do final da string temos q colocar 0x00 para isso atribuimos ela na posiçao da variavel [rm.rm_eo - rm.rm_so]

Código:
#include <stdio.h>
#include <regex.h>
#include <string.h>

int main(void)
{
   char fts[100] = "by hacker fts315";
   char hack[100];
   regex_t r;
   regmatch_t rm;
   regcomp(&r,"hac.*ker",REG_EXTENDED);
   regexec(&r,fts,1,&rm,0);
   strncpy(hack,fts + rm.rm_so, rm.rm_eo - rm.rm_so);
   hack[rm.rm_eo - rm.rm_so] = 0x00;
   printf("%s",hack);
   regfree(&r);
}

bom galera comparado com algumas linguagem o regex do c e um pouco mais complicado =/

by hacker fts315

https://www.facebook.com/hacker.fts315

Ver o tópico anterior Ver o tópico seguinte Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos