Sintaxe de Expressões Regulares do MySQL


Um expressão regular (regex) é um modo poderoso de especificar um pesquisa complexa.

O MySQL usa a implementação do Henry Spencer de expressões regulares, a qual está em conformidade com o POSIX 1003.2. MySQL usa a versão extendida.

Esta é uma referência simplória que salta os detalhes. Para obter informações exatas, veja a página manual do regex(7) de Henry Spencer que está incluída na distribuicão fonte. See Apêndice C, Colaboradores do MySQL.

Uma expressão regular descreve um conjunto de strings. A regexp mais simples é uma que não tenha nenhum caracter especial nela. Por exeplo, o regexp hello combina com hello e nada mais.

Expressões regulares não triviais usam certas construções especiais e assim podem encontrar mais de uma string. Por exemplo, o regexp hello|word combina tanto com a string hello quanto com a string word.

Como um exemplo mais complicado, o regexp B[an]*s mcombina com qualquer das strings Bananas, Baaaaas, Bs, e qualquer string iniciando com um B, e finalizando com um s, e contendo qualquer número de caracteres a ou n entre eles.

Um expressão reguklar pode utilizar qualquer dos um dos caracteres/ construtores especiais:

^

Combina com o inicio de uma string.

mysql> SELECT "fo\nfo" REGEXP "^fo$";           -> 0
mysql> SELECT "fofo" REGEXP "^fo";              -> 1


$

Combina com o fim de uma string.

mysql> SELECT "fo\no" REGEXP "^fo\no$";         -> 1
mysql> SELECT "fo\no" REGEXP "^fo$";            -> 0


.

Combina com qualquer caracter (incluindo novas linhas)

mysql> SELECT "fofo" REGEXP "^f.*";             -> 1
mysql> SELECT "fo\nfo" REGEXP "^f.*";           -> 1


a*

Combina com qualquer sequência de zero ou mais carcteres a.

mysql> SELECT "Ban" REGEXP "^Ba*n";             -> 1
mysql> SELECT "Baaan" REGEXP "^Ba*n";           -> 1
mysql> SELECT "Bn" REGEXP "^Ba*n";              -> 1


a+

Cobina com qualquer sequência de um ou mais caracteres a.

mysql> SELECT "Ban" REGEXP "^Ba+n";             -> 1
mysql> SELECT "Bn" REGEXP "^Ba+n";              -> 0


a?

Combina com zero ou um caracter a.

mysql> SELECT "Bn" REGEXP "^Ba?n";              -> 1
mysql> SELECT "Ban" REGEXP "^Ba?n";             -> 1
mysql> SELECT "Baan" REGEXP "^Ba?n";            -> 0


de|abc

Combina tant com a sequencia de como com abc.

mysql> SELECT "pi" REGEXP "pi|apa";             -> 1
mysql> SELECT "axe" REGEXP "pi|apa";            -> 0
mysql> SELECT "apa" REGEXP "pi|apa";            -> 1
mysql> SELECT "apa" REGEXP "^(pi|apa)$";        -> 1
mysql> SELECT "pi" REGEXP "^(pi|apa)$";         -> 1
mysql> SELECT "pix" REGEXP "^(pi|apa)$";        -> 0


(abc)*

Combina com zero ou mais instâncias da sequência abc.

mysql> SELECT "pi" REGEXP "^(pi)*$";            -> 1
mysql> SELECT "pip" REGEXP "^(pi)*$";           -> 0
mysql> SELECT "pipi" REGEXP "^(pi)*$";          -> 1


{1}, {2,3}

Existe um modo mais geral de se escrever regexp que combinam com muitas ocorrências de um átomo anterior.

a*

Pode ser escrito como a{0,}.

a+

Pode ser escrito como a{1,}.

a?

Pode ser escrito como a{0,1}.

Para ser mais preciso, um átomo seguido por um limite contendo um inteiro i e nenhuma vírgula casa com uma sequência de exatamente i combinações do átomo. Um átomo seguido por um limite contendo i e uma virgula casa com uma sequência de i ou mais combinações do átomo. Um átomo seguido por um limite contendo dois inteiros i e j casa com uma seqquência de i até j (inclusive) combinações de átomos.

Ambos os argumentos devem estar na faixa de 0 ate RE_DUP_MAX (padrão é 255), inclusive. Se houver dois argumentos, o segundo deve ser maior ou igual ao primeiro.

[a-dX], [^a-dX]

Combina com qualquer caracter que seja (ou não, se ^ é usado) a, b, c, d ou X. Para incluir um caracter literal ], ele deve ser imediatamente seguido pelo colchete de abertura [. Para incluir um caracter literal -, ele deve ser escrito primeiro ou por ultimo. Assim o [0-9] encontra qualquer dígito decimal. Qualquer caracter que não tenha um significado definido dentro de um para [] não tem nenhum significado especial e combina apenas com ele mesmo.

mysql> SELECT "aXbc" REGEXP "[a-dXYZ]";         -> 1
mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]$";       -> 0
mysql> SELECT "aXbc" REGEXP "^[a-dXYZ]+$";      -> 1
mysql> SELECT "aXbc" REGEXP "^[^a-dXYZ]+$";     -> 0
mysql> SELECT "gheis" REGEXP "^[^a-dXYZ]+$";    -> 1
mysql> SELECT "gheisa" REGEXP "^[^a-dXYZ]+$";   -> 0


[[.caracter.]]

A sequência de caracteres daquele elemento ordenado. A sequência é um único elemento da lista de expressões entre colchetes. Um expressão entre colchetes contendo um elemento ordenado multi-caracter pode então combinar com mais de um caracter, por exemplo, se a sequência ordenada inclui um elemento ordenado ch, então a expresão regular [[.ch.]]*c casa com os primeiros cinco caracteres de chchcc.

[=classe_caracter=]

Uma classe equivalente, procura pela sequência de caracteres de todos elementos ordenados equivalentes àquele, incluindo ele mesmo.

Por exemplo, se o e (+) são os membros de uma classe equivalente, então [[=o=]], [[=(+)=]] e [o(+)] são todos sinônimos. Uma classe equivalente não pode ser o final de uma escala.

[:character_class:]

Dentro de colchets, o nome de uma classe de caracter entre [: e :] procura pela lista de todos os caracteres pertencentes a esta classe. Os nomes de classes de caracteres padrões são:

Nome Nome Nome
alnum digit punct
alpha graph space
blank lower upper
cntrl print xdigit

Ele procura pelas classes de caracteres definidas na página ctype(3) do manual. Um local pode forncer outros. Uma classe de caracter não pode ser usada como o final de uma escala.

mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+";       -> 1
mysql> SELECT "!!" REGEXP "[[:alnum:]]+";               -> 0


[[:<:]], [[:>:]]

Combina com a string null no inicio e no fim de uma palavra, respectivamente. Uma palavra é definida como uma sequencia de caracteres de palavra os quais não são nem precedido e nem seguidos por caracteres de palavras. Um caracter de palavra é um caracter alfa numérico (como definido por ctype(3)) ou um underscore (_).

mysql> SELECT "a word a" REGEXP "[[:<:]]word[[:>:]]";      -> 1
mysql> SELECT "a xword a" REGEXP "[[:<:]]word[[:>:]]";     -> 0


mysql> SELECT "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1

Extraido do Manual de Referência do MySQL 4.1