MySQL Expressões regulares (Regexp)
⚡ Resumo Inteligente
MySQL Expressões regulares (REGEXP) comparam valores de colunas com padrões flexíveis que os curingas não conseguem expressar. Este artigo explica a sintaxe de REGEXP, o sinônimo RLIKE, todos os metacaracteres suportados, exemplos de consultas corrigidas no banco de dados myflixdb e as funções de expressão regular adicionadas. MySQL 8.0.

Quais são MySQL expressões regulares?
MySQL expressões regulares Ajudam você a buscar dados que correspondam a critérios complexos. Uma expressão regular é um padrão que descreve o formato do valor que você está procurando, e não o valor em si.
Se você já trabalhou com MySQL curingasVocê pode se perguntar por que vale a pena aprender expressões regulares quando o operador LIKE produz resultados semelhantes. A resposta está no poder expressivo: os curingas oferecem apenas dois símbolos, enquanto as expressões regulares descrevem intervalos de caracteres, alternativas, repetições e posições de palavras em um único padrão.
Com o objetivo estabelecido, a próxima seção apresenta a sintaxe que você usará em todas as consultas REGEXP.
Sintaxe básica de REGEXP
A sintaxe básica de uma expressão regular é a seguinte.
SELECT * FROM table_name WHERE fieldname REGEXP 'pattern';
AQUI:
- “Instrução SELECT” é o padrão Instrução SELECT.
- “ONDE nome do campo” é o nome da coluna na qual a expressão regular é aplicada.
- “Padrão REGEXP” — REGEXP é o operador de expressão regular e 'pattern' representa o padrão a ser correspondido. RLIKE é um sinônimo de REGEXP e retorna os mesmos resultados. Para evitar confusão com o operador LIKE, é melhor usar REGEXP.
Vejamos agora um exemplo prático.
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
A consulta acima busca todos os títulos de filmes que contêm a palavra "código". Não importa se "código" aparece no início, no meio ou no final do título. Contanto que o título contenha o padrão, a linha é retornada.
Comparar o início de um valor com uma lista de caracteres
Suponha que desejemos os filmes cujos títulos comecem com a, b, c ou d, seguidos por qualquer número de outros caracteres. Combinamos uma lista de caracteres com o metacaractere circunflexo para obter esse resultado.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Executando o script acima em MySQL Workbench A consulta ao banco de dados myflixdb nos fornece os seguintes resultados.
| id_do_filme | título | diretor | ano_de lançamento | Categoria ID |
|---|---|---|---|---|
| 4 | Code Nome Black | Edgar Jimz | 2010 | NULL |
| 5 | As filhinhas do papai | NULL | 2007 | 8 |
| 6 | Anjos e Demonios | NULL | 2007 | 6 |
| 7 | Da Vinci Code | NULL | 2007 | 6 |
No padrão '^[abcd]', o acento circunflexo (^) exige que a correspondência comece no início do valor, e a lista de caracteres [abcd] aceita apenas títulos cuja primeira letra seja a, b, c ou d. A comparação não diferencia maiúsculas de minúsculas na ordenação padrão, razão pela qual “Code O nome “Black” é retornado.
Excluindo personagens com uma lista de caracteres negada
Vamos agora modificar o script e negar a lista de caracteres para ver quais linhas são retornadas.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Executando o script acima em MySQL A análise do Workbench com o banco de dados myflixdb nos fornece os seguintes resultados.
| id_do_filme | título | diretor | ano_de lançamento | Categoria ID |
|---|---|---|---|---|
| 1 | Piratas do Caribe 4 | Rob Marshall | 2011 | 1 |
| 2 | Esquecendo Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 3 | X-Men | 2008 | ||
| 9 | Honey mooners | John Schultz | 2005 | 8 |
| 16 | 67% culpado | 2012 | ||
| 17 | O Grande Ditador | Chalie Chaplie | 1920 | 7 |
| 18 | filme de exemplo | Anônimo | 8 | |
| 19 | filme 3 | John Brown | 1920 | 8 |
Dentro de uma lista de caracteres, o acento circunflexo muda de significado: '^[^abcd]' ainda ancora a correspondência no início, enquanto [^abcd] agora exclui todos os títulos que começam com um dos caracteres entre eles.
Estes dois exemplos utilizam apenas âncoras e listas de caracteres. A próxima seção aborda o conjunto completo de metacaracteres.
Metacaracteres de expressão regular
Os exemplos acima mostram a forma mais simples de uma expressão regular. Os metacaracteres permitem refinar uma busca por padrões: eles expressam repetição, alternativas, intervalos e posições. A tabela abaixo lista todos os metacaracteres suportados pelo MySQL Operador REGEXP, com um exemplo corrigido para cada um.
| carbonizar | Descrição | Exemplo | |
|---|---|---|---|
| * | O asterisco (*) corresponde a zero (0) ou mais instâncias de único personagem que o precede. | SELECT * FROM filmes WHERE título REGEXP 'da*'; corresponde a um “d” seguido por zero ou mais caracteres “a”, portanto Da Vinci Code e as filhinhas do papai se qualificam. Use 'da+' quando a letra “a” precisar estar presente. | |
| + | O mais (+) Corresponde a uma ou mais ocorrências do caractere que o precede. | SELECT * FROM `movies` WHERE `title` REGEXP 'mon+'; Retorna todos os filmes que contêm "mon" seguido por um ou mais caracteres "n". Por exemplo, Anjos e Demônios. | |
| ? | O ponto de interrogação (?) corresponde a zero (0) ou uma ocorrência do caractere que o precede. | SELECT * FROM `categorias` WHERE `category_name` REGEXP 'com?'; Combina “co” com um “m” opcional. Por exemplo, comédia e comédia romântica. | |
| . | O ponto (.) Corresponde a qualquer caractere único, exceto uma nova linha. | SELECT * FROM filmes WHERE `year_released` REGEXP '200.'; Lista todos os filmes lançados em um ano que começa com "200" seguido por um único caractere. Por exemplo, 2005, 2007, 2008. | |
| [abc] | O lista de caracteres [abc] corresponde a qualquer um dos caracteres entre colchetes. | SELECT * FROM `movies` WHERE `title` REGEXP '[vwxyz]'; Lista todos os filmes que contêm pelo menos um personagem de “vwxyz”. Por exemplo, X-Men e Da Vinci. Code. | |
| [^ abc] | O lista negada [^abc] Corresponde a qualquer caractere, exceto os que estão entre colchetes. | SELECT * FROM `movies` WHERE `title` REGEXP '^[^vwxyz]'; Lista todos os filmes cujo título não começa com um caractere em “vwxyz”. | |
| [AZ] | O intervalo [AZ] Corresponde a qualquer letra maiúscula. | SELECT * FROM `membros` WHERE `endereço_postal` REGEXP '[AZ]'; Indica todos os membros cujo endereço postal contém uma letra entre A e Z. Por exemplo, Janet Jones, com número de membro 1. | |
| [az] | O intervalo [az] Corresponde a qualquer letra minúscula. | SELECT * FROM `membros` WHERE `endereço_postal` REGEXP '[az]'; Exibe todos os membros cujo endereço postal contém uma letra entre a e z. Observe que a ordenação padrão não diferencia maiúsculas de minúsculas, portanto, esse intervalo também corresponde a letras maiúsculas. | |
| [0-9] | O intervalo [0-9] Corresponde a qualquer dígito de 0 a 9. | SELECT * FROM `members` WHERE `contact_number` REGEXP '[0-9]'; lista todos os membros cujo número de contato contém pelo menos um dígito. Por exemplo, Robert Phil. | |
| ^ | O acento circunflexo (^) ancora a correspondência ao início do valor. | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]'; Lista todos os filmes cujos títulos começam com “c” ou “d”. Por exemplo, Code Nomeie Black, Daddy's Little Girls e Da Vinci. Code. | |
| $ | O símbolo de dólar ($) ancora a correspondência ao final do valor. | SELECT * FROM `movies` WHERE `title` REGEXP 'code$'; Lista todos os filmes cujos títulos terminam com "code". Por exemplo, Davinci Code. | |
| | | O barra vertical (|) alternativas isoladas. | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]|^[u]'; Lista todos os filmes cujos títulos começam com “c”, “d” ou “u”. Por exemplo, Code Nome: Black, Da Vinci Codee Submundo – Awakening. | |
| \b | O limite da palavra (\b) Corresponde ao início ou ao fim de uma palavra. Substitui os marcadores mais antigos [[:<:]] e [[:>:]], que MySQL 8.0 removido. | SELECT * FROM `movies` WHERE `title` REGEXP '\\bfor'; A lista inclui todos os filmes com uma palavra que começa com "for". Por exemplo, Forgetting Sarah Marshall. MySQL 5.7 o padrão equivalente é '[[:<:]]for'. | |
| [[:aula:]] | O classe de personagem corresponde a um grupo nomeado de caracteres: [[:alpha:]] para letras, [[:space:]] para espaços em branco, [[:punct:]] para pontuação e [[:upper:]] para letras maiúsculas. Observe o duplo colchetes. | SELECT * FROM `movies` WHERE `title` REGEXP '^[[:alpha:][:space:]]+$'; A lista inclui todos os filmes cujos títulos contêm apenas letras e espaços. Por exemplo, "Forgetting Sarah Marshall", enquanto "Pirates of the Caribbean 4" é omitido devido ao dígito. | |
A barra invertida (\) é o caractere de escape. Porque MySQL primeiro analisa a string e depois o padrão; uma barra invertida literal deve ser escrita como uma barra invertida dupla (\\) dentro de um padrão REGEXP.
⚠️ Aviso de versão: MySQL A versão 8.0.4 substituiu o antigo mecanismo de expressões regulares pela biblioteca ICU. Os marcadores de palavras [[:<:]] e [[:>:]] foram removidos nessa versão, portanto, padrões copiados de material antigo falham com um "erro de sintaxe". MySQL 8.0. Use \b em vez disso.
Agora que todos os metacaracteres estão definidos, surge uma pergunta pertinente: quando o REGEXP deve substituir o operador LIKE, mais simples?
REGEXP vs LIKE: qual você deve usar?
Ambos os operadores filtram linhas por padrão, mas resolvem problemas diferentes. O operador LIKE entende apenas dois símbolos, enquanto o operador REGEXP entende o conjunto completo de metacaracteres mostrado acima. Essa capacidade tem um custo, portanto, a escolha é uma questão de equilíbrio, e não de preferência.
| Critério | COMO | REGEXP |
|---|---|---|
| Símbolos de padrão | % e _ apenas | Anchors, intervalos, alternância, quantificadores, classes de caracteres |
| Uso típico | Pesquisas por prefixo, sufixo e "contém" | Validação, múltiplas alternativas, correspondência com reconhecimento de posição |
| Utilização do índice | Possível quando o padrão não começa com % | Nunca usa um índice |
| Valor de retorno | VERDADEIRO ou FALSO | 1 ou 0, e NULL quando qualquer um dos operandos for NULL. |
Escolha LIKE para correspondências diretas, pois é legível e ainda permite o uso de índices. Escolha REGEXP quando um único padrão precisar expressar várias regras simultaneamente, como "começa com c ou d e termina com um dígito". Em tabelas grandes, reduza as linhas primeiro com uma condição indexada e, em seguida, aplique REGEXP a esse conjunto menor.
MySQL 8.0 funções de expressão regular
O operador REGEXP responde apenas a uma pergunta: o valor corresponde ao padrão? MySQL A versão 8.0 adicionou quatro funções que vão além e permitem localizar, por exemplotract, e reescreva o texto correspondente. Cada um aceita um argumento opcional match_type, onde 'c' força uma comparação que diferencia maiúsculas de minúsculas e 'i' força uma comparação que ignora maiúsculas e minúsculas.
- REGEXP_LIKE(expr, padrão) Retorna 1 quando o valor corresponde ao padrão. É a forma funcional do operador REGEXP, e o argumento `match_type` torna explícita a diferenciação entre maiúsculas e minúsculas.
- REGEXP_INSTR(expr, padrão) Retorna a posição do primeiro caractere da correspondência ou 0 quando o padrão não for encontrado.
- REGEXP_SUBSTR(expr, padrão) Retorna a própria substring correspondente, o que é útil para extrair um ano, um código ou um número de um valor de texto mais longo.
- REGEXP_REPLACE(expr, padrão, substituição) retorna o valor com cada correspondência substituída, permitindo assim a limpeza de dados dentro de um Consulta SQL UPDATE.
SELECT title, REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title FROM `movies` WHERE REGEXP_LIKE(title, '[0-9]');
A consulta acima retorna todos os títulos de filmes que contêm um dígito, juntamente com os próprios dígitos. MySQL 5.7 Essas funções não estão disponíveis, portanto o operador REGEXP continua sendo a única opção.
