Expressões regulares MYSQL (REGEXP) com sintaxe e exemplos
O que são expressões regulares?
Expressões regulares ajudam a pesquisar dados que correspondem a critérios complexos. Vimos os curingas no tutorial anterior. Se você já trabalhou com curingas antes, pode estar se perguntando por que aprender expressões regulares quando pode obter resultados semelhantes usando curingas. Porque, em comparação com os curingas, as expressões regulares nos permitem pesquisar dados que correspondam a critérios ainda mais complexos.
Sintaxe básica
A sintaxe básica para uma expressão regular é a seguinte
SELECT statements... WHERE fieldname REGEXP 'pattern';
AQUI -
- “Declarações SELECT…” é o padrão Instrução SELECT
- “ONDE nome do campo” é o nome da coluna na qual a expressão regular será executada.
- “Padrão REGEXP” REGEXP é o operador de expressão regular e 'padrão' representa o padrão a ser correspondido pelo REGEXP. RLIKE é o sinônimo de REGEXP e alcança os mesmos resultados que REGEXP. Para evitar confundi-lo com o operador LIKE, melhor usar REGEXP ao invés.
Vejamos agora um exemplo prático-
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
A consulta acima procura todos os títulos de filmes que contenham o código da palavra. Não importa se o “código” está no início, meio ou fim do título. Desde que esteja contido no título, será considerado.
Suponhamos que queremos procurar filmes que comecem com a, b, c ou d , seguidos por qualquer número de outros caracteres, como faríamos para conseguir isso. Podemos usar uma expressão regular junto com os metacaracteres para alcançar os resultados desejados.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Executando o script acima em MySQL bancada contra o myflixdb nos dá os seguintes resultados.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
4 | Code Name Black | Edgar Jimz | 2010 | NULL |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
6 | Angels and Demons | NULL | 2007 | 6 |
7 | Davinci Code | NULL | 2007 | 6 |
Vamos agora dar uma olhada em nossa expressão regular responsável pelo resultado acima.
'^[abcd]' o acento circunflexo (^) significa que a correspondência de padrão deve ser aplicada no início e a charlist [abcd] significa que apenas títulos de filmes que começam com a, b, c ou d são retornados em nosso conjunto de resultados.
Vamos modificar nosso script acima e usar a lista de caracteres NOT e ver quais resultados obteremos após executar nossa consulta.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Executando o script acima em MySQL workbench contra o myflixdb nos dá os seguintes resultados.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
3 | X-Men | 2008 | ||
9 | Honey mooners | John Schultz | 2005 | 8 |
16 | 67% Guilty | 2012 | ||
17 | The Great Dictator | Chalie Chaplie | 1920 | 7 |
18 | sample movie | Anonymous | 8 | |
19 | movie 3 | John Brown | 1920 | 8 |
Vamos agora dar uma olhada em nossa expressão regular responsável pelos resultados acima.
'^[^abcd]' o acento circunflexo (^) significa que a correspondência de padrão deve ser aplicada no início e a lista de caracteres [^abcd] significa que os títulos de filmes que começam com qualquer um dos caracteres incluídos são excluídos do conjunto de resultados.
Metacaracteres de expressão regular
O que vimos no exemplo acima é a forma mais simples de uma expressão regular. Vejamos agora correspondências de padrões de expressões regulares mais avançadas. Suponha que queiramos pesquisar títulos de filmes que comecem com o padrão “código” apenas usando uma expressão regular, como faríamos isso? A resposta são metacaracteres. Eles nos permitem ajustar nossos resultados de pesquisa de padrões usando expressões regulares.
carbonizar | Descrição | Exemplo | |
---|---|---|---|
* | A asterisco (*) metacaractere é usado para corresponder a zero (0) ou mais instâncias das strings que o precedem | SELECT * FROM filmes WHERE título REGEXP 'da*'; dará todos os filmes que contenham personagens “da”. Por exemplo, Código Da Vinci, Daddy's Little Girls. | |
+ | A mais (+) metacaractere é usado para corresponder a uma ou mais instâncias de strings que o precedem. | SELECT * FROM `movies` WHERE `title` REGEXP 'mon+'; dará todos os filmes contendo personagens “mon”. Por exemplo, Anjos e Demônios. | |
? | A questão(?) metacaractere é usado para corresponder a zero (0) ou uma instância das strings que o precedem. | SELECT * FROM `categorias` WHERE `category_name` REGEXP 'com?'; fornecerá todas as categorias contendo string com. Por exemplo, comédia, comédia romântica. | |
. | A ponto (.) metacaractere é usado para corresponder a qualquer caractere único, exceto uma nova linha. | SELECT * FROM filmes WHERE `year_released` REGEXP '200.'; dará todos os filmes lançados nos anos começando com os caracteres “200” seguidos por qualquer caractere único. Por exemplo, 2005,2007,2008 etc. | |
[abc] | A lista de charles [abc] é usado para corresponder a qualquer um dos caracteres incluídos. | SELECT * FROM `movies` WHERE `title` REGEXP '[vwxyz]'; fornecerá todos os filmes contendo qualquer personagem em “vwxyz”. Por exemplo, X-Men, Código Da Vinci, etc. | |
[^ abc] | A lista de charles [^abc] é usado para corresponder a quaisquer caracteres, exceto aqueles incluídos. | SELECT * FROM `movies` WHERE `title` REGEXP '^[^vwxyz]'; fornecerá todos os filmes que contenham personagens diferentes dos de “vwxyz”. | |
[AZ] | A [AZ] é usado para corresponder a qualquer letra maiúscula. | SELECT * FROM `membros` WHERE `endereço_postal` REGEXP '[AZ]'; fornecerá todos os membros que possuem endereço postal contendo qualquer caractere de A a Z. Por exemplo, Janet Jones com número de membro 1. | |
[az] | A [az] é usado para corresponder a qualquer letra minúscula | SELECT * FROM `membros` WHERE `endereço_postal` REGEXP '[az]'; fornecerá todos os membros que possuem endereços postais contendo qualquer caractere de a a z. .Por exemplo, Janet Jones com número de membro 1. | |
[0-9] | A [0-9] é usado para corresponder a qualquer dígito de 0 a 9. | SELECIONE * FROM `membros` ONDE `número_de_contato` REGEXP '[0-9]' dará a todos os membros que enviaram números de contato contendo caracteres “[0-9]”. Por exemplo, Robert Phil. | |
^ | A acento circunflexo (^) é usado para iniciar a partida no início. | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]'; dá todos os filmes com o título começando com qualquer um dos personagens em “cd”. Por exemplo, Code Name Black, Daddy's Little Girls e Da Vinci Code. | |
| | A barra vertical (|) é usado para isolar alternativas. | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]|^[u]'; dá todos os filmes com o título começando com qualquer um dos personagens em “cd” ou “u”. Por exemplo, Code Name Black, Daddy's Little Girl, Da Vinci Code e Underworld – Awakening. | |
[[:<:]] | A[[:<:]] corresponde ao início das palavras. | SELECT * FROM `movies` WHERE `title` REGEXP '[[:<:]]for';
dá todos os filmes com títulos começando com os personagens. Por exemplo: Esquecendo Sarah Marshal. |
|
[[:>:]] | A [[:>:]] corresponde ao final das palavras. | SELECT * FROM `movies` WHERE `title` REGEXP 'ack[[:>:]]';
dá todos os filmes com títulos que terminam com os personagens “ack” .Por exemplo, codinome preto. |
|
[:classe:] | A [:classe:] corresponde a uma classe de personagem, ou seja
[:alfa:] para combinar letras, [:espaço:] para corresponder ao espaço em branco, [: ponto:] corresponde às pontuações e [:upper:] para letras de classe alta. |
SELECT * FROM `movies` WHERE `title` REGEXP '[:alpha:]';
dá todos os filmes com títulos contendo apenas letras .Por exemplo, Esquecendo Sarah Marshal, X-Men etc. Filmes como Piratas do Caribe 4 serão omitidos nesta consulta. |
A barra invertida (\) é usada como caractere de escape. Se quisermos usá-lo como parte do padrão em uma expressão regular, devemos usar barras invertidas duplas (\\)
Resumo
- As expressões regulares fornecem uma correspondência de padrões poderosa e flexível que pode nos ajudar a implementar utilitários de pesquisa avançados para nossos sistemas de banco de dados.
- REGEXP é o operador usado ao realizar correspondências de padrões de expressões regulares. RLIKE é o sinônimo
- As expressões regulares suportam vários metacaracteres que permitem mais flexibilidade e controle ao realizar correspondências de padrões.
- A barra invertida é usada como caractere de escape em expressões regulares. Só é considerado na correspondência de padrões se forem utilizadas barras invertidas duplas.
- Expressões regulares não diferenciam maiúsculas de minúsculas.