:: DEVELOPER ZONE
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 | 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
© 1995-2005 MySQL AB. All rights reserved.
