Expressões Regulares©2002 FABRICIO FERRARI

Uma expressão regular (ER ou regexp) é um padrão que denota um conjunto de caracteres. As expressões regulares são tradicionalente usadas para selecionar e alterar textos. A correspondência de uma ER com um determinado texto pode resultar em sucesso ou fracasso, que, dependendo das circunstâncias, é o resultado que se quer comparar.

Uma expressão regular especifica um conjunto de caracteres para comparação, algo como qualquer linha que comece com a e termine com b ou qualquer palavra que contenha três ou quatro a's juntos e assim por diante. Estes padrões caracterizam a classe de comparação das expressões regulares. Veremos como representá-los por conjuntos de caracteres.

Expressões regulares são usadas por muitos aplicativos UNIX, como grep, sed, awk, vi, emacs, perl e outros. A maioria destes aplicativos possui o seu próprio conjunto de códigos para representar as ER, mas a maioria deles são comuns entre todos. A tabela [*] mostra as classes mais comuns de expressões regulares.


Tabela 6.1: Especificadores de Expressões Regulares.
ESPECIFICADOR SIGNIFICADO
c Um caracter sozinho especifica ele mesmo
. Coincide com qualquer caracter exceto $ \backslash$n (nova linha)
* Zero ou mais ocorrências do caracter anterior
+ Uma ou mais ocorrências do caracter anterior
? Zero ou uma ocorrência do caracter anterior
$ \vert$ Alterna entre a classe anterior e posterior
$ \widehat{\ }$ Como o caracteres mais à esquerda, o circunflexo ancora a ER ao início da linha, ou seja, a linha deverá começar com o caracter imediatamente depois do $ \widehat{\ }$
$ Como o caracteres mais à direita, o cifrão ancora a ER ao fim da linha, ou seja, a linha deve terminar com o caracter que imediatamente antecede o $.
$ \{m\}$
$ \{m,\}$
$ \{,m\}$
$ \{m,n\}$
Uma ER de um caracter seguido por $ \{m\}$, $ \{m,\}$, $ \{,m\}$ ou $ \{m,n\}$ é uma ER que coincide com um intervalo de ocorrências desta ER de um caracter. $ \{m\}$ significa exatas $ m$ ocorrências; $ \{m,\}$ para no mínimo $ m$ ocorrências, $ \{,m\}$ no máximo $ m$ e $ \{m,n\}$ entre $ m$ e $ n$ ocorrências. $ \{0,\}$ corresponde a *, $ \{1,\}$ a + e $ \{0,1\}$ a ?.
[...] Classes: qualquer caracter entre os colchetes.
(...) Agrupamento
$ \backslash$m $ m=1-9$ substitui a $ m$-ésima ocorrência entre $ ()$


As expressões regulares formam entidades tão genéricas que devem ser previamente testadas para evitar efeitos colaterais. As ER representam um valioso recurso de trabalho. Além de sua generalidade, estão disponíveis em grande parte dos aplicativos do UNIX. Observe os exemplos que seguem.

Por exemplo, a ER ab*c significa a seguido por zero ou mais (*) b's e um c. Coincidiria com ac, abc, abbc, abbbc e assim por diante. Já ab+c não representaria ac, mas abc, abbc, abbbc sim. Os caracteres *, +, ., ? são chamados de multiplicadores nas expressões regulares. Outra construção comum dos multiplicadores é .* que significa uma seqüência de qualquer tamanho e qualquer caracter.

Se colocamos o circunflexo $ \widehat{\ }$ no início da ER, como em $ \widehat{\ }$Âncora, estamos coincidindo a ER com uma linha que começa com esta palavra, mas nenhuma outra. Já colocando um $ no fim da linha, como em fim da linha$, restinge-se a RE a terminar com fim da linha. Assim, na ER $ \widehat{\ }$tudo$ a linha só poderá conter o que tiver entre o $ \widehat{\ }$ e $. Por restringir o início e fim da ER, $ \widehat{\ }$ e $ são chamados de âncoras.

Como as expressões regulares estão na maioria dos aplicativos de respeito no UNIX, convém conferir as pequenas variações entre os especificadores de um e outro. Alguns aplicativos expandem a lista de especificadores enquanto outros apresentam pequenas variações. Além disso, existem situações em que os caracteres de classe das ER precisam ser mascarados, via caracter de fuga $ \backslash$, para que sejam corretamente interpretados pelo aplicativo. Consulte o manual do aplicativo em questão (man page) e a página 7 do manual regex, digitando man 7 regex.

leon 2008-08-19