Utilizando metacharacters
Expressões regulares são utilizadas por varias linguagens de programação e em diversos sistemas operacionais, e o Oracle não é exceção, ele oferece esse poderoso recurso em sua linguagem. São formadas por diversos símbolos e códigos conhecidos como metacharacters, e são utilizados para buscar partes de um determinado texto. A seguir veremos três quadros com os operadores, classes POSIX e intervalos de caracteres:
Operadores das
expressões regulares
|
|
Operador
|
Descrição
|
( )
|
Trata a expressão ou o conjunto
de literais como uma subexpressão.
|
[...]
|
O par de colchetes delimita uma
lista de uma ou mais expressões: combinações de elementos, símbolos, classes
equivalentes, classes de caractere ou expressões de dimensão.
|
[^...]
|
Uma expressão de não igualdade.
Indica que a lista de expressões dentro dos colchetes não deve ser encontrada.
|
[. ...]
|
O uso do ponto especifica uma
combinação de elementos de acordo com o local. Muito útil em situações onde
dois ou mais caracteres são necessários para especificar um elemento, como
por exemplo, na especificação de um limite entre “a” e “ch” utilizaremos
[a...[.ch.]].
|
[:...:]
|
Especifica uma classe de
caracteres.
|
[=...=]
|
Especifica uma classe de
equivalência, por exemplo, [=e=] representa “e”, “é”, “è”, “ë”.
|
.
|
O ponto combina qualquer caractere.
|
?
|
Combina zero ou uma ocorrência da
subexpressão que o precede.
|
*
|
Combina zero ou mais
ocorrências da subexpressão que o precede.
|
+
|
Combina zero ou mais
ocorrências da subexpressão que o precede.
|
{n1}
|
Combina precisamente n1
ocorrências da subexpressão que o precede.
|
{n1,}
|
Combina n1 ou mais ocorrências
da subexpressão que o precede.
|
{n1, n2}
|
Combina as ocorrências entre n1
e n2, inclusive os limites, da subexpressão que o precede.
|
\
|
Dependendo do contexto a contra
barra é apenas uma contra barra, se estiver precedendo outro operador este é
transformado em literal, por exemplo, \+ é o valor literal do mais.
|
\n1
|
Referencia anterior, repetição
de “n1vezes” da subexpressão dentro da expressão anterior.
|
|
|
Operador lógico “OU”. Utilizado
para separar duas expressões, onde uma delas é combinada.
|
^
|
Ancora de inicio de linha.
|
$
|
Ancora de fim de linha.
|
Classes de
caracteres POSIX
|
|
Classes de
caracteres
|
Tipos de
caracteres
|
[:alnum:]
|
Caracteres alfanuméricos.
Inclui letras e números, omitindo pontuação.
|
[:alpha:]
|
Caracteres do alfabeto. Apenas
letras.
|
[:blank:]
|
Caracteres que formam espaços.
|
[:cntrl:]
|
Caracteres de controle (que não
são impressos).
|
[:digit:]
|
Caracteres numéricos.
|
[:graph:]
|
Todas as classes de caracter
combinadas, [:punct:], [:upper:], [:lower:], [:digit:].
|
[:lower:]
|
Caracteres minúsculos.
|
[:print:]
|
Caracteres que podem ser
impressos.
|
[:punct:]
|
Caracteres de pontuação.
|
[:space:]
|
Caracteres de espaço que não
podem ser impressos.
|
[:upper:]
|
Caracteres maiúsculos.
|
[:xdigit:]
|
Caracteres hexadecimais.
|
Intervalos de caracteres
|
|
Intervalo
|
Tipos de caractere
|
[A-Z]
|
Todos os caracteres do alfabeto
maiúsculos.
|
[a-z]
|
Todos os caracteres do alfabeto
minúsculos.
|
[0-9]
|
Todos os dígitos numéricos.
|
[1-9]
|
Todos os dígitos numéricos
excluindo o zero.
|
Resumindo:
- Operadores metacharacters formam o fundamento das expressões regulares;
- Os padrões das expressões regulares são construídos com os operadores metacharacters;
- Dependendo do contexto, certos caracteres literais podem ser operadores de expressões regulares com capacidades especiais;
- Expressões regulares podem incluir caracteres literais;
- Literais entre colchetes representam uma série de possíveis valores, ou uma lista a ser obedecida;
- Parênteses agrupam expressões e subexpressões;
- Uma expressão seguida de um sinal de mais, interrogação ou asterisco será interpretada como um padrão que deve ser repetido de acordo com as regras do operador;
- É possível especificar faixas de caracteres;
- Classes de caracteres servem como alternativa para faixas e provêem um melhor suporte a aplicações de vários idiomas;
Funções de expressões regulares
Existem várias funções do Oracle que estendem as capacidades das funções de texto como SUBSTR e INSTR, essas extensões consistem em funções que dão suporte as expressões regulares:
Funções de expressões regulares
|
||
Função
|
Parâmetros
|
Descrição
|
REGEXP_SUBSTR
|
s1 (uma string obrigatória).
Pattern1 (expressão regular
obrigatória).
p1 (numero opcional, default
1).
n1 (numero opcional, default
1).
m1 (um ou mais dos parâmetros
literais de correspondência).
|
Pesquisa dentro de s1 por
qualquer correspondência definida em pattern1. Inicia a busca na posição p1
procurando pela n1 ocorrência do padrão. Realiza a combinação de acordo com
as instruções de m1.
|
REGEXP_INSTR
|
S1 (uma string obrigatória).
pattern1 (expressão regular
obrigatória).
p1 (numero opcional, default
1).
n1 (numero opcional, default
1).
opt1 (numero, limitado entre
zero ou um, default zero).
m1 (um ou mais dos parâmetros
literais de correspondência).
|
Procura em s1 por qualquer
substring que seja igual ao padrão definido em pattern1. Inicia a busca na
posição p1, procurando pela n1 ocorrência do padrão. Realiza a comparação de
acordo com as instruções de m1. O resultado é um numero que representa a
localização de pattern1 em s1. Se opt1 = 1, então é retornado a localização
da primeira posição depois de pattern1.
|
REGEXP_REPLACE
|
S1 (uma string obrigatória).
pattern1 (expressão regular
obrigatória).
repl (string opcional, nulo
como default).
p1 (numero opcional, default
1).
o1 (numero opcional, default
0).
m1 (string literal que permite
alterar o comportamento de igualdade, onde ‘c’ procura por correspondência
‘case-sensitive‘, ‘i’ por ‘case-insensitive’, ‘n’ correspondência para qualquer
caractere, ‘m’ trata a fonte de dados como multilinha, se omitido é
considerado como linha única, e ‘x’ ignora espaços).
|
Substitui o1 ocorrências de
pattern1 de s1 por repl, iniciando da posição p1. Realiza a correspondência
de acordo com as instruções de m1.
|
REGEXP_LIKE
|
s1 (string obrigatória).
pattern1 (expressão regular
obrigatória).
m1 (um ou mais parâmetros
literais).
|
Compara pattern1 com a string
s1 e determina se existe igualdade. Realiza a correspondência de acordo com as
instruções definidas em m1. A resposta é booleano, se verdadeiro encontrou
correspondência, caso contrário falso (não deve-se utilizar os operadores
‘coringas’ do LIKE).
|
Para buscar uma determinada palavra em uma frase podemos fazer o seguinte:
SELECT REGEXP_SUBSTR('RUA ALBERTO DE OLIVEIRA N.9999', '[[:alpha:]]+', 1, 2) FROM DUAL;
No exemplo acima a segunda palavra será retornada, pois estamos procurando por uma sequência de caracteres, iniciando na primeira posição e que seja a segunda ocorrência.
Agora se a intenção for encontrar uma sequência de números:
SELECT REGEXP_SUBSTR('RUA ALBERTO DE OLIVEIRA N.9999', '[[:digit:]]+') FROM DUAL;
Do mesmo modo poderíamos mostrar não o numero mas em que posição ele ocorre em nosso texto:
SELECT REGEXP_INSTR('RUA ALBERTO DE OLIVEIRA N.9999', '[[:digit:]]+') FROM DUAL;
Resumindo:
- Existem funções SQL que dão suporte a expressões regulares;
- REGEXP_SUBSTR, REGEXP_INSTR, REGEXP_LIKE e REGEXP_REPLACE são as funções em SQL que permitem o uso as expressões regulares;
Padrões de substituição
Como visto anteriormente, para substituição de caracteres podemos usar o REGEXP_REPLACE, que utiliza expressões regulares para substituição. Vejamos o primeiro exemplo, o padrão [.]+ indicaria que desejamos substituir o caractere ponto, ainda nessa expressão temos o sinal de mais que indica que a substituição deve ocorrer uma ou mais vezes consecutivas:
SELECT REGEXP_REPLACE(‘PADROES DE SUBSTITUICAO.....................CAP 02’, ‘[.]+’, ‘-’) FROM DUAL;
O comando acima teria como resultado a string ‘PADROES DE SUBSTITUICAO-CAP 02’.
Também é possível indicar mais de um caractere a ser substituído:
SELECT REGEXP_REPLACE('ESPECIAIS: ! @ ? # $', '[!@?#$]', '*') FROM DUAL;
No exemplo acima o resultado seria ‘ESPECIAIS: * * * * *’.
Um dos usos frequentes das expressões regulares é a substituição de espaços:
SELECT REGEXP_REPLACE('TEXTO COM ESPAÇO, DEVE SER FORMATADO' , '( ){2,}', ' ') FROM DUAL;
No exemplo acima a expressão regular inicia com espaço em branco entre parênteses, seguido do numero dois com vírgula entre chaves, o numero dois com vírgula indica que o padrão é o definido no caractere anterior, espaço, em duas ou mais ocorrências, com isso toda sequência de dois ou mais espaços é substituída por um único.
Outro exemplo de uso seria para o caso de se substituir certo conjunto de caracteres:
SELECT REGEXP_REPLACE('SAO PAULO, RP 601000', '(^[[:alpha:] ]+)', 'HABITANTES') FROM DUAL;
No exemplo acima estamos substituindo parte do texto ('SAO PAULO’) pela palavra ‘HABITANTES’, a busca ocorre por qualquer caractere, repetindo a referencia com o sinal de mais, é importante ressaltar o espaço entre os colchetes finais, sem ele apenas a primeira palavra seria substituída.
Para finalizar os exemplos de substituição faremos algo relativamente complexo, vamos alterar a ordem em que as palavras da frase aparecem e ainda incluiremos uma marcação em uma dessas partes:
SELECT REGEXP_REPLACE('SAO PAULO, RP 601000', '(^[[:alpha:] ]+), ([[:alpha:]]{2}) ([[:digit:]]{6})', '\3 \2-"\1"') FROM DUAL;
No ultimo exemplo incluímos a nossa expressão mais duas, onde a segunda recupera uma sequencia de dois caracteres e a terceira uma sequencia de seis números, a substituição deve ocorrer da seguinte forma, o terceiro conjunto (números) deve aparecer primeiro, seguido do segundo (duas letras), e o ultimo deve ser o primeiro conjunto entre parênteses, observe que ainda entre o segundo e o primeiro conjunto temos agora um traço, o resultado seria ‘601000 RP-"SAO PAULO"’.
Resumindo:
- A função REGEXP_REPLACE pode substituir substring de uma string utilizando expressões regulares;
- O uso de expressões regulares com a tarefa de substituição de texto é uma alternativa poderosa ao uso da função REPLACE, que não suporta o uso de expressões regulares;
- O operador backreference (contra barra mais um numero) pode ser usado como terceiro parâmetro para substituir um padrão, e especificar expressões agrupadas dentro de um padrão como parte de uma substituição;
Expressões regulares e a restrição CHECK
Outra utilização para as expressões regulares é na restrição CHECK, como já foi visto a restrição CHECK verifica o conteúdo de uma coluna, ele possui uma regra que deve ser obedecida para que o registro seja salvo. Vejamos um exemplo:
CREATE TABLE CLIENTES(
CODIGO NUMBER(10) PRIMARY KEY,
DESCRICAO VARCHAR2(100),
EMAIL VARCHAR2(120)
,CONSTRAINT CK_EMAIL_CLI CHECK (
REGEXP_LIKE(EMAIL, '^([[:alnum:]]+)@[[:alnum:]]+.(com|net|org|edu|gov|mil)$')));
O exemplo acima mostra o uso da expressão regular como condição da restrição CHECK, a expressão indica que qualquer caractere é permitido antes e depois do arroba ( o arroba é obrigatório), sendo que os caracteres posteriores devem ser seguidos de ponto e um dos termos listados em seguida, perceba que os valores listados estão separados pelo separador logico OU, onde apenas um deles é permitido.
Resumindo:
- É possível criar restrições CHECK que usam expressões regulares;
- Restrições CHECK podem usar expressões regulares para definir restrições e requisitos para os dados a serem inseridos/atualizados na tabela;
- A condição REGEXP_LIKE é muito útil quando usada em uma restrição CHECK;
Comentários
Postar um comentário
Obrigado por Participar do programero, fique a vontade para agradecer, retificar, perguntar ou sugerir.