No MySQL, o
REGEXP
O operador é usado para determinar se uma string corresponde ou não a uma expressão regular. É um sinônimo para REGEXP_LIKE()
. Se a string corresponder à expressão regular fornecida, o resultado será
1
, caso contrário é 0
. Sintaxe
A sintaxe fica assim:
expr REGEXP pat
Onde
expr
é a string de entrada e pat
é a expressão regular para a qual você está testando a string. Exemplo 1 – Expressão Regular Básica
A expressão regular mais básica que podemos usar é aquela que não possui caracteres especiais. Aqui, usamos apenas uma string. Se qualquer parte da string de entrada corresponder a essa string, ela retornará uma correspondência.
SELECT 'Milho' REGEXP 'Milho' AS 'Milho', 'Bolota' REGEXP 'Milho' AS 'Bolota', 'Canto' REGEXP 'Milho' AS 'Canto', 'Queijo' REGEXP 'Milho' AS 'Queijo ';
Resultado:
+------+-------+--------+--------+| Milho | Bolota | Canto | Queijo |+------+-------+--------+--------+| 1 | 1 | 1 | 0 |+------+-------+--------+--------+
Exemplo 2 – Corresponder ao início de uma string
Neste exemplo, a expressão regular especifica que a string deve começar com
Co
. SELECT 'Milho' REGEXP '^Co' AS 'Milho', 'Acorn' REGEXP '^Co' AS 'Acorn', 'Cheese' REGEXP '^Co' AS 'Cheese';
Resultado:
+------+-------+--------+| Milho | Bolota | Queijo |+------+-------+--------+| 1 | 0 | 0 |+------+-------+--------+
Exemplo 3 – Corresponder ao final de uma string
Neste exemplo, a expressão regular especifica que a string deve terminar com
rn
. SELECT 'Milho' REGEXP 'rn$' AS 'Milho', 'Bolata' REGEXP 'rn$' AS 'Bolota', 'Queijo' REGEXP 'rn$' AS 'Queijo';
Resultado:
+------+-------+--------+| Milho | Bolota | Queijo |+------+-------+--------+| 1 | 1 | 0 |+------+-------+--------+
Exemplo 4 – Corresponder a qualquer caractere
O
.
caractere corresponde a qualquer caractere. SELECIONE 'Milho' REGEXP '.' AS 'Milho', 'Queijo' REGEXP '.' AS 'Queijo', '' REGEXP '.' AS '';
Resultado:
+------+--------+---+| Milho | Queijo | |+------+--------+---+| 1 | 1 | 0 |+------+--------+---+
Esse caractere é normalmente usado em conjunto com outros caracteres para especificar critérios adicionais. Por exemplo:
SELECT 'Milho' REGEXP '^C.rn$' AS 'Milho', 'Crn' REGEXP '^C.rn$' AS 'Crn';
Resultado:
+------+-----+| Milho | Crn |+------+-----+| 1 | 0 |+------+-----+
Aqui especificamos que a string deve começar com
C
, que deve ser seguido por um caractere (qualquer caractere) e que deve terminar com rn
. Observe que esse caractere especifica uma única instância do caractere. Se você quiser especificar várias instâncias (por exemplo
ee
em vez de apenas e
), você precisará adicionar mais .
personagens. SELECT 'Tweet' REGEXP '^Tw..t$' AS 'Tweet', 'Tweat' REGEXP '^Tw..t$' AS 'Tweat', 'Tweet' REGEXP '^Tw.t$' AS 'Tweet', 'Twit' REGEXP '^Tw..t$' AS 'Twit';
Resultado:
+-------+-------+-----------+------+| Tweet | Tweat | Tweet | Twit |+-------+-------+-----------+------+| 1 | 1 | 0 | 0 |+-------+-------+-----------+------+
Outra maneira de fazer isso é especificar o número de ocorrências entre colchetes:
SELECT 'Tweet' REGEXP '^Tw.{2}t$' AS 'Tweet', 'Tweat' REGEXP '^Tw.{2}t$' AS 'Tweat', 'Tweet' REGEXP '^Tw. {1}t$' AS 'Tweet', 'Twit' REGEXP '^Tw.{2}t$' AS 'Twit';
Resultado:
+-------+-------+-----------+------+| Tweet | Tweat | Tweet | Twit |+-------+-------+-----------+------+| 1 | 1 | 0 | 0 |+-------+-------+-----------+------+
No entanto, se você conhece o caractere que está procurando, pode especificar esse caractere (em vez do
.
caractere), conforme demonstrado no exemplo a seguir. Exemplo 5 – Corresponder a zero ou mais instâncias de um caractere específico
Podemos fazer o seguinte para especificar zero ou mais instâncias do
e
personagem:SELECT 'Twet' REGEXP '^Twe*t$' AS 'Twet', 'Tweet' REGEXP '^Twe*t$' AS 'Tweet', 'Tweeet' REGEXP '^Twe*t$' AS 'Tweeet ', 'Twt' REGEXP '^Twe*t$' AS 'Twt', 'Twit' REGEXP '^Twe*t$' AS 'Twit', 'Twiet' REGEXP '^Twe*t$' AS 'Twiet', 'Tweit' REGEXP '^Twe*t$' AS 'Tweit';
Resultado:
+------+-------+--------+-----+------+-------+- ------+| Tweet | Tweet | Tweet | Twt | Twit | Twit | Tweet |+------+-------+--------+-----+------+-------+-- -----+| 1 | 1 | 1 | 1 | 0 | 0 | 0 |+------+-------+--------+-----+------+-------+-- -----+
As quatro primeiras partidas, mas as três últimas não.
Exemplo 6 – Corresponder a uma ou mais instâncias de um caractere específico
Podemos modificar o exemplo anterior para obtermos uma correspondência apenas se um ou mais caracteres for encontrado (o exemplo anterior retornou uma correspondência se zero ou mais foram encontrados). Para fazer isso, simplesmente usamos
+
em vez de *
:SELECT 'Twet' REGEXP '^Twe+t$' AS 'Twet', 'Tweet' REGEXP '^Twe+t$' AS 'Tweet', 'Tweeet' REGEXP '^Twe+t$' AS 'Tweeet ', 'Twt' REGEXP '^Twe+t$' AS 'Twt', 'Twit' REGEXP '^Twe+t$' AS 'Twit', 'Twiet' REGEXP '^Twe+t$' AS 'Twiet', 'Tweit' REGEXP '^Twe+t$' AS 'Tweit';
Resultado:
+------+-------+--------+-----+------+-------+- ------+| Tweet | Tweet | Tweet | Twt | Twit | Twit | Tweet |+------+-------+--------+-----+------+-------+-- -----+| 1 | 1 | 1 | 0 | 0 | 0 | 0 |+------+-------+--------+-----+------+-------+-- -----+
Nesse caso, a quarta palavra retorna um resultado diferente do exemplo anterior.
Exemplo 7 – Corresponder a zero ou uma instância de um caractere específico
Podemos modificar o exemplo anterior para que obtenhamos apenas uma correspondência em zero ou um dos caracteres desejados. Para fazer isso, usamos
?
:SELECT 'Twet' REGEXP '^Twe?t$' AS 'Twet', 'Tweet' REGEXP '^Twe?t$' AS 'Tweet', 'Tweeet' REGEXP '^Twe?t$' AS 'Tweeet ', 'Twt' REGEXP '^Twe?t$' AS 'Twt', 'Twit' REGEXP '^Twe?t$' AS 'Twit', 'Twiet' REGEXP '^Twe?t$' AS 'Twiet', 'Tweit' REGEXP '^Twe?t$' AS 'Tweit';
Resultado:
+------+-------+--------+-----+------+-------+- ------+| Tweet | Tweet | Tweet | Twt | Twit | Twit | Tweet |+------+-------+--------+-----+------+-------+-- -----+| 1 | 0 | 0 | 1 | 0 | 0 | 0 |+------+-------+--------+-----+------+-------+-- -----+
Exemplo 8 - Alternação
Você pode usar o
|
caractere para corresponder a uma ou outra sequência de caracteres:SELECT 'Tweet' REGEXP 'Tw|et' AS 'Tweet', 'For Let' REGEXP 'Tw|et' AS 'For Let', 'Banana' REGEXP 'Tw|et' AS 'Banana';
Resultado:
+-------+---------+-----------+| Tweet | Para Let | Banana |+-------+---------+------------+| 1 | 1 | 0 |+-------+---------+------------+
Aqui está outro exemplo em que pesquiso palavras inteiras:
SELECT 'Gato' REGEXP 'Gato|Cão' COMO 'Gato', 'Cão' REGEXP 'Gato|Cão' COMO 'Cão', 'Cachorro' REGEXP 'Gato|Cão' AS 'Cachorro', 'Banana' REGEXP 'Gato|Cão' COMO 'Banana';
Resultado:
+-----+-----+---------+--------+| Gato | Cão | Perdido | Banana |+-----+-----+---------+--------+| 1 | 1 | 1 | 0 |+-----+-----+---------+------------+
Ainda obtemos uma correspondência mesmo quando nossa expressão regular corresponde apenas a parte da string.
Exemplo 9 – Corresponder a zero ou mais instâncias de uma sequência
Você pode usar colchetes junto com o asterisco()*
para especificar zero ou mais instâncias de uma sequência:
SELECIONE 'Banana' REGEXP '(uma)*' AS 'Banana', 'Terra' REGEXP '(uma)*' AS 'Terra', 'Queijo' REGEXP '(uma)*' AS 'Queijo';
Resultado:
+--------+------+--------+| Banana | Terreno | Queijo |+--------+------+--------+| 1 | 1 | 1 |+--------+------+--------+
Outro exemplo:
SELECT 'Banana' REGEXP '^B(an)*d$' AS 'Banana', 'Band' REGEXP '^B(an)*d$' AS 'Band', 'Bald' REGEXP '^B( an)*d$' AS 'Calvo', 'Ruim' REGEXP '^B(an)*d$' AS 'Ruim';
Resultado:
+--------+------+------+-----+| Banana | Banda | Careca | Ruim |+--------+------+------+-----+| 0 | 1 | 0 | 0 |+--------+------+------+-----+Exemplo 10 – Repetição
Como visto em um exemplo anterior, você pode usar chaves para especificar a repetição. Essa notação fornece uma maneira mais geral de escrever expressões regulares do que alguns dos exemplos anteriores:
SELECT 'Tweeet' REGEXP 'e{3}' AS 'Tweeet', 'Tweet' REGEXP 'e{3}' AS 'Tweet';
Resultado:
+--------+-------+| Tweet | Tweet |+--------+-------+| 1 | 0 |+--------+-------+Exemplo 11 – Intervalo
Você pode usar o caractere de hífen para especificar um intervalo. Aqui está um exemplo que especifica um intervalo de números:
SELECT 'Tweet 123' REGEXP '[0-9]' AS 'Tweet 123', 'Tweet ABC' REGEXP '[0-9]' AS 'Tweet ABC';
Resultado:
+--------+-------+| Tweet | Tweet |+--------+-------+| 1 | 0 |+--------+-------+
E o exemplo a seguir especifica um intervalo de letras:
SELECT 'Tweet 123' REGEXP '[A-Z]' AS 'Tweet 123', 'ABC' REGEXP '[A-Z]' AS 'ABC', '123' REGEXP '[A-Z]' AS '123';
Resultado:
+--------+-------+| Tweet | Tweet |+--------+-------+| 1 | 0 |+--------+-------+
Aqui está o que acontece se limitarmos o intervalo de números:
SELECT '123' REGEXP '[1-3]' AS '123', '012' REGEXP '[1-3]' AS '012', '045' REGEXP '[1-3]' AS '045 ';
Resultado:
+-----+-----+-----+| 123 | 012 | 045 |+-----+-----+-----+| 1 | 1 | 0 |+-----+-----+-----+Exemplo 12 – Fora de um intervalo
Podemos usar o^
caractere para modificar o exemplo anterior para que o intervalo de caracteres especificado seja excluído:
SELECT '123' REGEXP '[^1-3]' AS '123', '012' REGEXP '[^1-3]' AS '012', '045' REGEXP '[^1-3]' AS '045';
Resultado:
+-----+-----+-----+| 123 | 012 | 045 |+-----+-----+-----+| 0 | 1 | 1 |+-----+-----+-----+
Assim, obtemos o resultado oposto ao exemplo anterior.