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
Ótimo post!! Muito obrigado.
ResponderExcluirObrigado pelo comentário!
ExcluirValeu mesmo, eu tirei a minha duvida.
ResponderExcluirObrigado pelo feedback Jailson!
Excluir