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
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.