Páginas

4 de out. de 2010

Expressões regulares no Oracle Database


    Uma expressão regular (regexp) é uma sequência de caracteres compostos de literais e meta caracteres que descrevem um padrão em um texto. Expressões regulares são úteis para realizar pesquisas e manipulações de strings e podem ser usadas para reforçar CHECK CONSTRAINTs.

    Expressões Regulares estão disponíveis no Oracle Database a partir da versão 10G e são implementadas de acordo com o padrão POSIX para ASCII, através de 4 funções: REGEXP_LIKE, REGEXP_REPLACE, REGEXP_INSTR e REGEXP_SUBSTR.

    Segue abaixo a lista de alguns dos meta-caracteres mais utilizados em regexp:
       - \ : Caractere de escape -> trata o próximo caractere como um literal na expressão
       - * : Quantificador estrela -> combina zero ou mais ocorrências de uma subexpressão precedendo o meta caractere.
       - . : Ponto -> combina qualquer caractere.
       - + : Quantificador mais -> combina uma ou mais ocorrências da subexpressão precendendo o caractere meta.
       - ^ : Início de âncora de linha -> combina a próxima expressão quando ela ocorre no início de uma linha.
       - $ : Fim de âncora de linha -> combina a expressa precedente somente quando ela ocorre no final de uma   linha.
       - [...] : Lista de caracteres de combinação -> combina qualquer caractere na lista.
       - [^...] : Lista de caracteres que não combinam -> combina qualquer caractere que não está na lista.
       - ? : Quantificador de marca de questão -> combina zero ou uma ocorrência de uma subexpressão    precedendo o meta caractere.
       - {m} : Intervalo -> combina exatamente m ocorrências do caractere.
       - {m,} : Intervalo -> combina no mínimo m ocorrências do caractere.
       - {m,n} : Intervalo -> combina no mínimo m ocorrência do caractere e no máximo n ocorrências da subexpressão precedente.
       - \n : Referencia de volta -> combina a nth subexpressão precedente, where n é um inteiro de 1 a 9
       - | : Operador OR -> combina ambos os caracteres ou palavras.
       - (...) : Subexpressão ou agrupamento -> combina uma expressão como uma unidade.
      - [:class:] : Classe de caracteres POSIX -> combina qualquer caractere pertencendo a uma classe especificada de caracteres.

    Segue abaixo um exemplo, passo-a-passo, de uma consulta com regexp utilizando a função REGEXP_LIKE:
   
    PASSO 1: Criando a tabela CLIENTE:
          CREATE TABLE CLIENTE              ( ID        NUMBER,               NOME      VARCHAR2(50),               DT_NASC   CHAR(8));

    PASSO 2: Inserindo dados na tabela CLIENTE:
        INSERT INTO CLIENTE (ID, NOME, DT_NASC) VALUES (1, 'FÁBIO PRADO', '19780101');
        INSERT INTO CLIENTE (ID, NOME, DT_NASC) VALUES (2, 'CHUCK NORRIS', '19500230');
        INSERT INTO CLIENTE (ID, NOME, DT_NASC) VALUES (3, 'HOMMER SIMPSON', '9b420431');
        INSERT INTO CLIENTE (ID, NOME, DT_NASC) VALUES (4, 'FRED FLINSTONE', 'a1820331');
        INSERT INTO CLIENTE (ID, NOME, DT_NASC) VALUES (5, 'ELVIS PRESLEY', '195c0513');
        COMMIT;


    PASSO 3: Utilizando regexp para efetuar uma consulta na tabela CLIENTE para retornar somente registros com datas cadastradas com 8 dígitos e contendo somente caracteres numéricos:
        
                    SELECT     NOME,
                                        DT_NASC
                    FROM       CLIENTE
                    WHERE     REGEXP_LIKE(DT_NASC,'^[[:digit:]]{8}$');


    Obs.: :digit: é uma classe de caracteres POSIX. {8} indica o tamanho da expressão que antecede esse valor. 
                          
    RESULTADO:
               NOME                                               DT_NASC 
                 ---------------------------------------         -----------
                 FÁBIO PRADO                              19780101
                 CHUCK NORRIS                          19500230



   O mais díficil em utilizar expressões regulares é montar a expressão com os meta-caracteres. Para te ajudar neste trabalho, sugiro o site TESTE DE REGEXP (EXPRESSÕES REGULARES). Nele você poderá testar suas expressões regulares e você também encontrará alguns exemplos muito úteis, tais como, expressões para validar e-mail, telefone e URL.

  
COMENTÁRIOS FINAIS:
     Expressões regulares são muito poderosas e permitem efetuar qualquer padrão de pesquisa, porém avalie muito bem a sua utilização. Se forem mal utilizadas poderão ser muito lentas  e consequentemente, poderão degradar a performance da instrução SQL.


REFERÊNCIAS:
   - Treinamento oficial Oracle Database 10g: SQL Fundamentals Part 2
   - Função REGEXP_LIKE:   
            http://support.cs.nott.ac.uk/help/docs/databases/oracle/standard/server.101/b10759/conditions018.htm
   - Oracle Regular Expressions: http://www.psoug.org/reference/regexp.html

4 comentários: