Professional Documents
Culture Documents
Introduo a
Expresses Regulares
Eis o cenrio: voc recebe o trabalho de verificar palavras duplicadas (tais como isto
isto) em pginas de um servidor web, um problema comum em documentos sujeitos
muita edio. A sua tarefa criar uma soluo que:
Aceite qualquer quantidade de arquivos para verificar, informe cada linha de cada
arquivo que tenha palavras duplicadas, destaque cada palavra repetida (usando as
strings de caracteres de escape ANSI [American National Standard Institute rgo
americano para estabelecimento de padres e normas tcnicas]) e garanta que o nome
de arquivo fonte aparea com cada linha no relatrio.
Trabalhe atravs de linhas, mesmo encontrando situaes onde uma palavra ao final
de uma linha repetida no incio da seguinte.
Encontre palavras repetidas, apesar das diferenas de converso para maiscula, tais
como com The the..., assim como que permita quantidades diversas de espao em
branco (espaos, tabulaes, novas linhas e similares) ficar entre as palavras.
Encontre palavras duplicadas mesmo quando separadas por tags (tags, rtulos) HTML
[Hypertext Markup Language Linguagem de Marcao de Hipertexto]. As tags HTML
servem para marcar texto em pginas da World Wide Web, para transformar, por
exemplo, uma palavra em negrito: ... it is <B>very</B> very important... ( muito
importante).
Certamente, esta uma ordem comprida! Mas, um problema real que precisa ser re-
solvido. Em determinado ponto, ao trabalhar no manuscrito deste livro, executei tal fer-
ramenta sobre o que eu tinha escrito at ento e fiquei surpreso com a quantidade de
palavras duplicadas que tinha aparecido. H muitas linguagens de programao que se
poderia usar para solucionar o problema, porm, uma que tenha suporte expresso
regular pode tornar o trabalho substancialmente mais fcil.
Expresses regulares so primordiais para processamento de texto poderoso, flexvel
e eficiente. As prprias expresses regulares, com uma notao de padro geral quase
como uma mini linguagem de programao, permitem que voc descreva e analise texto.
1
2 Captulo 1: Introduo a Expresses Regulares
Com o suporte adicional fornecido com o uso de uma ferramenta especial, as expresses
regulares podem acrescentar, remover, isolar e, de uma maneira geral, dobrar, alongar e
mutilar todos os tipos de texto e de dados.
Poderia ser to simples quanto um comando de busca de um editor de texto, ou to po-
derosa quanto uma linguagem completa de processamento de texto. Este livro mostra as
vrias maneiras pelas quais as expresses regulares podem aumentar a sua produtivida-
de. Ele o ensina como pensar em expresses regulares, para que voc possa domin-las,
usufruindo a vantagem de toda a magnitude da fora delas.
Um programa completo que solucione o problema de palavra repetida pode ser implantado
em apenas algumas linhas de muitas das linguagens de programao populares de hoje em
dia. Com um nico comando localizar-e-substituir de expresso regular, voc pode encontrar
e destacar no documento as palavras duplicadas. Com um outro, possvel remover todas
as linhas sem palavras repetidas (deixando apenas as linhas de interesse para relatar). Por
fim, com um terceiro, voc pode garantir que cada linha a ser exibida inicie com o nome do
arquivo de onde a linha veio. No prximo captulo, veremos exemplos em Perl e Java.
A linguagem hospedeira (Perl, Java, VB.NET ou qualquer que seja), oferece suporte peri-
frico de processamento, mas, a verdadeira fora vem das expresses regulares. Aprovei-
tando essa fora para as suas prprias necessidades, voc pode aprender como escrever
expresses regulares para identificar o texto desejado, enquanto ignora o texto que no
deseja. Depois, voc pode combinar as suas expresses com a construo de suporte
da linguagem para, na verdade, fazer algo com o texto (acrescentar cdigos adequados
destacados, remover o texto, alterar o texto e assim por diante).
capaz de verificar todos os arquivos e confirmar o que precisava saber. Tempo total per-
dido: talvez 15 segundos para digitar o comando e outros 2 segundos para a verificao
de todos os dados. Uau! (Se voc estiver interessado em ver o que realmente usei, d uma
olhada adiante, na pgina 32).
Como um outro exemplo, certa vez eu estava ajudando um amigo com alguns problemas
de e-mail em uma mquina remota e ele queria me enviar uma listagem das mensagens
de seu arquivo da caixa de correio. Eu poderia ter carregado uma cpia de todo o arquivo
em um editor de texto e, manualmente, removido tudo, exceto as linhas de cabealho
de cada mensagem, deixando uma espcie de ndice. Mesmo se o arquivo no fosse to
grande quanto era e, mesmo se eu no estivesse conectado a uma lenta linhas discadas, a
tarefa teria sido lenta e montona. Da mesma forma, eu teria sido colocado na inconfor-
tvel posio de, realmente, ver o texto da correspondncia pessoal dele.
De novo, expresses regulares para o resgate! Eu dei um simples comando (usando a fer-
ramenta comum de busca egrep, descrita mais adiante neste captulo) para exibir a linha
From:[de] e Subject: [assunto] de cada mensagem. Para informar ao egrep quais tipos de
linha eu queria ver, usei a expresso regular ^(From|Subject):.
Quando ele obteve a sua lista, pediu-me para enviar uma mensagem em especial (5.000 linhas!).
Novamente, usar um editor de texto ou o prprio sistema de e-mail para extrair apenas uma
mensagem, demoraria muito tempo. Em vez disso, eu usei uma outra ferramenta (uma chamada
sed) e, de novo, usei expresses regulares para descrever exatamente o texto no arquivo que
queria. Assim, pude extrair e enviar a mensagem desejada, rapidamente e com facilidade.
Poupar a ambos muito tempo e irritao usando a expresso regular no foi excitante,
mas com certeza, muito mais excitante do que perder uma hora no editor de texto. Se eu
no conhecesse expresses regulares, nunca teria pensado que havia uma alternativa. As-
sim, com justia, esta estria demonstra como expresses regulares e ferramentas associa-
das podem capacit-lo a fazer coisas que voc poderia pensar nunca ser capaz de fazer.
Quando aprender as expresses regulares, voc perceber que elas so parte valiosa de
seu conjunto de ferramentas e se ver imaginando que no poderia viver sem elas.
Um comando total sobre as expresses regulares uma habilidade valiosa. Este livro
oferece as informaes necessrias para conseguir tal habilidade e a minha esperana
que ele fornea tambm a motivao para faz-lo.
Se voc tem uma TiVo [Television Input Video Output Entrada de Televiso Sada de Vdeo] conhece o
sentimento!
4 Captulo 1: Introduo a Expresses Regulares
* e terminamos com a literal .txt, de modo que terminamos com um padro que significa
selecione os arquivos cujos nomes comeam com qualquer coisa e terminam com .txt.
A maioria dos sistemas oferece alguns caracteres especiais adicionais, porm, geralmente,
esses padres de nome de arquivo so limitados em fora expressiva. Isso no implica
em muitos problemas, pois o escopo do problema (oferecer maneiras convenientes de
especificar grupos de arquivos) limitado, quer dizer, apenas a nomes de arquivos.
Por outro lado, lidar com texto em geral um problema bem maior. Prosa e poesia, pro-
grama de listagens, relatrios, HTML, tabelas de cdigo, listas de palavras ... voc decide,
se uma necessidade particular especfica o bastante, tal como selecionar arquivos,
voc pode desenvolver um tipo de esquema especializado ou de ferramenta para ajud-lo
na tarefa. No entanto, com o passar dos anos, foi desenvolvida uma linguagem de padro
generalizado, que poderosa e expressiva para uma ampla variedade de usos. Cada pro-
grama a implementa e a usa de maneira diferente, porm, de maneira geral, essa podero-
sa linguagem padro, e os prprios padres, so chamados de expresses regulares.
A Analogia de Linguagem
Expresses regulares completas so compostas por dois tipos de caracteres. Os caracteres
especiais (como o * da analogia de nome de arquivo) so chamados de metacaracteres,
enquanto que os demais so chamados de literais, ou caracteres de texto normal. Alm
dos padres de nome de arquivo, o que define as expresses regulares so os expressivos
poderes avanados que seus metacaracteres oferecem. Os padres de nome de arquivo
oferecem limitados metacaracteres s necessidades limitadas, porm, uma linguagem de
expresso regular oferece metacaracteres ricos e expressivos para usos avanados.
Pode ser til pensar em expresses regulares como a linguagem delas mesmo, com texto
literal agindo como as palavras e os metacaracteres como a gramtica. As palavras so
combinadas com a gramtica, de acordo com um conjunto de regras, para criar uma ex-
presso que comunica uma ideia. No exemplo do e-mail, a expresso que usei para encon-
trar linhas comeando com From: ou Subject: foi [^(From|Subject)]:.
Os metacaracteres esto sublinhados; em breve chegaremos interpretao deles.
Como com o aprendizado de qualquer outra linguagem, inicialmente, as expresses regu-
lares podem parecer intimidantes. Por isso elas se parecem com mgica queles com ape-
beginning with From: or Subject: was ! ( From;Subject ):". The metachar-
acters are underlined; well get to their interpretation soon.
O Estado de Esprito da Expresso Regular 5
As with learning any other language, regular expressions might seem intimidating
at rst. This is why it seems like magic to those with only a supercial understand-
nas
ing,um
andconhecimento superficial,
perhaps completely e talvez inacessvel
unapproachable to thosepara aqueles
who que nunca
have never seen as viram.
it at
Regular Expressions
Mas, assimas
all. But, como
just as abcdefghi! ficaria
a Language wouldlogo
soonclaro a um aluno
become clear de a 5studenta of
to Japons,
Japanese, regular
expresso the regular
em expression in
The Language Analogy
s!<nfase>([0-9]+(\.[0-9]+) {3})</nfase>!<inet>$1</inet>!
s!<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>!<inet>$1</inet>!
Full regular
willexpressions
logo ficarbecome
soon arecrystal
clara como composed
gua para
clear toofvoc
twotambm.
you, types of characters. The special
too.
characters (like the + from the lename analogy) are called metacharacters, while
Este
This exemplo
example de um script de linguagem Perl que that
o meu editor usouused
para to modificar
modifyum a ma-
the rest are called literal,isorfromnormal a Perltext language
characters.script What setsmy editor
regular expressions
nuscrito.
manuscript. O autor tinha
The author usado por engano
hadadvanced
mistakenly a digitao de
used thepowers tag <nfase>
typesetting para marcar
tag <emphasis> endereos
to
apart fromIP lename
da Internet patterns
(que soare the
conjuntos de pontos expressive
e nmeros que se that their
parecem commeta- 209.204.146.22). A
mark
charactersmgica
provide.Internet IP addr esses (which are sets of periods and numbers that look like
usa oFilename
comandopatterns provide
de substituio de limited
texto demetacharacters
Perl com a expresso for limited
regular
needs, but209.204.146.22
a regular ). Thelanguage
expression incantationprovides
uses Perls rich text-substitution
and expressive metachar- command with the
regular expression
<nfase>([0-9]+(\.{[0-9]+) {3})</nfase>
acters for advanced uses.
para substituir tais tags pela tag apropriada <inet>, enquanto deixa de fora os outros usos
It might de
help ! <emphasis>([0-9]+(\.[0-9]+){3})</emphasis>"
to consider
<nfase>. regular expressions
Em captulos posteriores, as voctheir own language,
aprender os detalhes withdeliteral
como, exatamente,
esse
text acting tipo
toasreplace
the wordsdesuch
mgica tagsmetacharacters
and montado,
with portanto,
the appropriateas the voc sertag,
grammar.
<inet> capaz
Thewhile de leaving
words aplicar
are com-as tcnicas
other uses s
of suas
bined withprprias
grammar necessidades,
according com
to a o
setseuof prprio
rules to aplicativo
create an ou linguagem
expression
<emphasis> alone. In later chapters, youll learn all the details of exactly how this thatde programao.
com-
municatesO an
type idea. In thelivro
of incantation
objetivo deste email example, the
is constructed, expression
so youll be able I used
to applyto nd the lines
techniques to
beginningyourwithown From:needs, orwith
Subject:
your own was ! ( From;Subject
application or programming):". Thelanguage.
metachar-
acters areAunderlined;
chance de well que voc
get toprecisar substituir tags
their interpretation soon.<nfase> por tags <inet> pequena,
mas, bem provvel que voc incorrer em problemas semelhantes a substituir isto por
Regular expressions are easy! A somewhat humorous comment about this: as Chapter 3 explains,
As with learning
aquilo. any
O other language,
objetivo deste livroregular
no ensinar expressions
soluesmightpara seem intimidating
problemas
the term regular expression originally comes from formal algebra. When people ask me what my
especficos, mas ao
contrrio,
at rst. This is why
book it ensin-lo
is about, seems likecomo
the answer magic pensar
regular sobre
toexpressions
those with expresses
onlya ablank
draws regulares,
supercial de modo
understand-
face if they are not quefamiliar
already voc seja
with de
ing, and capaz
perhaps the completely
concept. The
superar Japanese
qualquer word for regular
problema
unapproachable que expression,
possa
to those surgir.
who abcd
have never , meansseen
as little
it to
at the average
Japanese as its English counterpart, but my reply in Japanese usually draws a bit more than a blank
all. But, just
stare.asYou see, the regular partwould
abcdefghi! soon become
is unfortunately pronounced clear to a tostudent
identically a much more of common
Ominds
Estado
word, a de Esprito da Expresso Regular
medical
Japanese, the regular expression in
until I explain!
term for repr oductive organs. You can only imagine what ashes through their
Regular Expresses
expressions regulares
are easy!so A fceis!
somewhatUm comentrio,
humorous de certa forma
comment abouthumorstico, sobre isso:
this: as Chapter conforme explica o Captulo
3 explains,
the term 3,regular
originalmente o termo
expression expresso
originally regular
comes oriundo
from formaldaalgebra.
lgebra formal.
When Quando
people asaskpessoas me perguntam
me what my de que trata
o meu the
book is about, livro,answer
a resposta expresses
regular regulares
expressions as deixa
draws com um
a blank facearifinexpressivo
they are not se already
j no estiverem
familiar familiarizadas com
with the oconcept.
conceito.The Japanese
A palavra word para
Japonesa for regular expression,
a expresso regular, abcd,significa
means astolittle
pouco to para
the average
o Japons mediano quanto
Japanese para
as itso English counterpart,
correspondente but my
em ingls, masreply in Japanese
a minha resposta em usually draws
Japons, a bit morecausa
normalmente, than mais
a blank
do que um rosto inex-
stare. Youpressivo.
see, the regular
Veja part regular,
isto, a parte is unfortunately pronounced
infelizmente identically
pronunciada da mesma to a forma
muchque moreumacommon
palavra muito comum, um
word, a termo
medical term para
mdico for repr oductive
rgos organs.Voc
reprodutores. Youpode
can imaginar
only imagine
o que vemwhat ashes
mente das through
pessoastheir
at que eu explique!
minds until I explain!
6 Captulo 1: Introduo a Expresses Regulares
O shell de comando a parte do sistema que aceita os seus comandos digitados e, de fato, executa o programa soli-
citado. Com o shell que eu uso, as aspas simples servem para agrupar o argumento do comando, dizendo ao shell para
no prestar muita ateno ao que est dentro. Se eu no us-las, o pode pensar, por exemplo, de um *, que eu pretendia
que fizesse parte da expresso regular, como se fosse realmente parte de um padro de nome de arquivo que ele devia
interpretar. No quero que isso acontea, portanto, uso as aspas para ocultar do shell os metacaracteres. Usurios de
Windows de COMMAND COM ou CMD.EXE provavelmente devem usar aspas duplas.
Metacaracteres Egrep 7
Metacaracteres Egrep
Vamos comear a explorar alguns dos metacaracteres egrep que fornecem sua fora de
expresso regular. Passarei rapidamente por eles com alguns exemplos, deixando os
exemplos detalhados e as descries para captulos posteriores.
Convenes Tipogrficas. Antes de comear, por favor, reveja as convenes tipogrficas ex-
plicadas no prefcio, na pgina xix. Este livro cria certas novidades na rea de digitao,
portanto, algumas das minhas notaes podem, em princpio, no ser familiares.
^ s usado para ancorar a combinao (do resto da expresso regular) para o incio
da linha. Da mesma forma, cat$ s encontra c-a-t ao final da linha, tal como uma linha
terminando com scat.
melhor se acostumar a interpretar expresses regulares de uma maneira mais literal. Por
exemplo, no pense que
^cat combina uma linha com cat no incio
e sim que:
^cat combina se voc tiver o incio de uma linha, imediatamente seguido por c,
logo seguido por a e logo depois seguido por t.
Ambos os finais significam a mesma coisa, porm, ler da maneira mais literal permite que
voc entenda intrinsecamente uma nova expresso quando a vir. Como egrep interpreta
combinar texto real. Alm de oferecer caracteres literais, como cat em sua expresso re-
gular, voc tambm pode usar alguns dos itens discutidos nas prximas poucas sees.
Classes de Caracteres
Combinando qualquer um de vrios caracteres
Digamos que voc queira buscar por grey [cinza], mas tambm encontrar se tiver sido so-
letrado como gray [cinza]. A expresso regular que montei [...], geralmente chamada de
uma classe de caracteres, permite que voc relacione os caracteres que deseja permitir quele
ponto na combinao. Enquanto que e combina apenas um e e a combina apenas um a, a
expresso regular ea combina ambos. Portanto, veja gr[ea]y: isso quer dizer para encontrar
g, seguido de r, seguido por um e ou um a, tudo seguido por y. Pelo fato de eu ser pssimo
em soletrar, estou sempre usando expresses regulares como esta na imensa lista de palavras
em Ingls, para descobrir a soletrao certa. Uma que uso com frequncia sep[ea]r[ea]te,
porque nunca consigo me lembrar se a palavra soletrada seperate, separate ou separete
[separado]. A que aparece na lista a de grafia certa; expresses regulares para o resgate.
Observe como fora de uma classe, caracteres literais (como o g e o r de gr[ea]y) tm
um implcito e depois entre eles combinar g e depois r ... Isso totalmente o
oposto dentro de uma classe de caracteres. O contedo de uma classe uma lista de
caracteres que pode combinar quela altura, da a implicao ser or [ou].
Como um outro exemplo, talvez voc queira permitir letra maiscula na primeira letra de uma
palavra, tal como com [Ss]mith. Lembre-se de que isso ainda combinar linhas que contenham
smith (ou Smith) embutido em uma outra palavra, tal como com blacksmith [ferreiro]. Eu no
quero bater sempre na mesma tecla atravs dessa viso geral, mas essa questo parece ser uma
fonte de problemas dentre alguns novos usurios. Abordarei algumas formas de lidar com esse
problema de palavra embutida depois que examinarmos mais alguns metacaracteres.
Na classe, possvel relacionar tantos caracteres quantos voc quiser. Por exemplo,
[123456] combina qualquer dos dgitos relacionados. Essa classe em especial, pode ser
til como parte de <H[123456]>, que combina <H1>, <H2>, <H3>, etc. Isso pode ajudar
ao buscar cabealhos HTML.
Dentro de uma classe de caracteres, o metacaractere de classe de caracteres - (trao, traves-
so), indica uma faixa de caracteres: <H[1-6]>, idntica ao exemplo anterior. [0-9] e [a-z]
so abreviaes comuns de classes para combinar dgitos e letras minsculas em ingls, res-
pectivamente. Faixas mltiplas so boas, assim, [0123456789abcdefABCDEF] pode ser escrita
como [0-9a-fA-F], (ou talvez [A-Fa-f0-9], visto que a ordem na qual so dadas as faixas no
importa). Estes trs ltimos exemplos podem ser teis ao processar nmeros hexadecimais.
Voc pode combinar livremente faixas com caracteres literais: [0-9A-Z_!.?], combinar um dgi-
to, letra maiscula, sublinhado, ponto de exclamao, ponto ou ponto de interrogao.
Observe que um trao s um metacaractere dentro de uma classe de caracteres caso
contrrio, ele combina com o caractere normal de trao. Na verdade, ele nem sempre
um metacaractere dentro de uma classe de caracteres. Se ele for o primeiro caractere rela-
cionado na classe, provavelmente, ele pode no indicar uma faixa, assim, no conside-
rado um metacaractere. Da mesma forma, o ponto de interrogao e o ponto ao final da
classe, normalmente so metacaracteres de expresso regular, mas s quando no dentro
de uma classe (portanto, para ficar claro, os nicos metacaracteres especiais dentro da
classe em [0-9A-Z_!.?] so os dois traos / travesses).
Metacaracteres Egrep 9
Lendo ^cat$, ^$ e ^
Respostas s perguntas da pgina 7.
^cat$ Literalmente, significa: combina se a linha tiver um incio de linha (que,
claro, todas as linhas tm), imediatamente seguido por c-a-t, e depois, ime-
diatamente seguido pelo final da linha.
Efetivamente, significa: uma linha que consiste apenas de cat sem pala-
vras extras, espaos, pontuao, apenas cat.
^$ Literalmente, significa: combina se a linha tiver um incio de linha, imedia-
tamente seguido pelo final da linha.
Efetivamente, significa: uma linha vazia (sem qualquer contedo, nem ao
menos espaos).
^ Literalmente, significa: combina se a linha tiver um incio de linha.
Efetivamente, sem sentido! Visto que cada linha tem um incio, cada linha
combinar at mesmo as linhas que esto vazias!
Considere as classes de caracteres como a mini linguagem delas. As regras relativas su-
portadas pelos metacaracteres (e o que eles fazem) so completamente diferentes dentro
e fora de classes de caracteres.
Veremos mais exemplos disso em breve.
Classes de Caracteres Negadas
Se voc usar [^...] em vez de [...], a classe combina qualquer caractere que no esteja re-
lacionado. Por exemplo, [^1-6] combina um caractere que no de 1 a 6. O ^ precedente
na classe, nega a lista, portanto, em vez de relacionar os caracteres que deseja incluir na
classe, voc relaciona os caracteres que no deseja que sejam includos.
Voc pode ter notado que o ^ usado aqui igual ao circunflexo de incio de linha apre-
sentado na pgina 7. O caractere o mesmo, mas o significado completamente diferente.
Exatamente como a palavra em ingls wind pode significar coisas diferentes no contexto
(s vezes uma brisa forte, s vezes o que voc faz com um relgio), o mesmo pode acontecer
com um metacaractere. J vimos um exemplo, o intervalo de construo do trao / travesso.
Ele s vlido dentro de uma classe de caracteres (e l, apenas quando no inicialmente den-
tro da classe). ^ uma ncora de linha fora de uma classe, porm, um metacaractere de classe
dentro de uma classe (exceto apenas quando est imediatamente aps a chave de abertura da
classe; caso contrrio, ele no especial dentro de uma classe). No tenha medo h casos
especiais mais complexos, outros, que veremos mais adiante, no so to ruins.
Como um outro exemplo, vamos buscar aquela lista de palavras em ingls que tm q
seguido por algo diferente de u. Traduzir isso em uma expresso regular, se torna q[^u].
Experimentei isso na lista que tenho e, com certeza, no havia muitos. Encontrei alguns,
inclusive uma srie de palavras que eu nem sabia que existiam em ingls.
Eis o que aconteceu. (O que eu digitei est em negrito.)
10 Captulo 1: Introduo a Expresses Regulares
19.03.76.
Algumas coisas esto acontecendo com este exemplo que, inicialmente, poderiam no
ficar claras. Em 19[-./]03[-./]76 no h metacaracteres, pois eles esto dentro de uma clas-
se de caracteres. (Lembre-se, a lista de metacaracteres e seus significados so diferentes
dentro e fora das classes de caracteres.) Os traos (ou travesses), neste caso, tambm
no so metacaracteres de classe, pois cada um a primeira coisa depois de [ ou [^. Se
eles no estivessem na frente, como com [.-/], eles seriam a classe de faixa de metaca-
racteres, o que nesta situao, seria um erro.
Resposta ao Questionrio
Resposta pergunta da pgina 10.
Por que q[^u] no combina com Qantas ou Iraq?
Qantas no combinou porque a expresso regular pedia um q em letra maiscula,
visto que o Q em Qantas maisculo. Se tivssemos usado Q[^u], o teramos encon-
trado, mas no os outros, pois eles no tm um Q em maiscula. A expresso [Qq]
[^u] teria encontrado todos eles.
De certa forma, o exemplo de Iraq faz uma pergunta ardilosa. A expresso regular
pede um q seguido por um caractere que no u, o que impede combinar q ao final
da linha. Normalmente, as linhas tm caracteres de nova linha em cada extremidade
Metacaracteres Egrep 11
final, mas, um pequeno fato que me esqueci de mencionar (me desculpe!) foi que
egrep as retira antes de verificar com a expresso regular, assim, aps um q terminan-
do a linha, no h um u com o qual ser combinado.
No se sinta mal por causa da pergunta ardilosa. Deixe-me garantir que se egrep no tivesse
retirado automaticamente as novas linhas (muitas outras ferramentas no as retira), ou se Iraq
tivesse sido seguido por espaos, outras palavras ou no, a linha teria sido combinada.
importante para entender, eventualmente, os pequenos detalhes de cada ferramenta, porm,
a esta altura, o que eu gostaria que voc entendesse a partir deste exerccio que uma classe
de caracteres, mesmo negada, ainda exige um caractere com o qual combinar.
Alternncia
Combinando qualquer de vrias subexpresses
Um metacaractere muito conveniente |, o qual significa ou. Ele permite que voc
combine mltiplas expresses em uma nica expresso que combina com qualquer das
individuais. Digamos, por exemplo, que Bob e Robert sejam expresses separadas, mas
Bob|Robert seja uma expresso que combina com qualquer uma delas. Quando combi-
nadas assim, as subexpresses so chamadas de alternativas.
Voltando ao nosso exemplo gr[ea]y, interessante notar que ele pode ser escrito como
grey|gray e at como gr(a|e)y. O ltimo caso usa parnteses para restringir a alternn-
cia. (A ttulo de registro, os parnteses tambm so metacaracteres.) Observe que algo
como gr[a|e]y no o que queremos dentro de uma classe, o caractere | apenas
um caractere normal, como a e e.
Com gr(a|e)y, so necessrios os parnteses, pois, sem eles, gra|ey significa gra ou
ey, que no desejamos aqui. A alternncia vai longe, mas no alm dos parnteses. Um
outro exemplo (First|1st)[Ss]treet [Rua Um]. De fato, visto que ambos First e 1st ter-
Uma vez, na quarta srie, eu estava liderando a competio de soletrao quando fui solicitado a soletrar
miss. A minha resposta foi m-i-s-s[falha, engano]. A Srta. Smith teve o prazer de me dizer que no, que era
M-i-s-s [Senhorita, mulher jovem, solteira], com M maisculo, que eu deveria ter pedido uma sentena de
exemplo, e que eu estava fora. Foi um momento traumtico na vida de um menino. Depois daquilo, nunca mais
gostei da Srta. Smith e, desde ento, tenho sido muito ruim em soletrao.
12 Captulo 1: Introduo a Expresses Regulares
minam com st, a combinao pode ser abreviada para (Fir|1)st[Ss]treet. Necessariamen-
te, isso no muito fcil de ler, mas, assegure-se de entender que, efetivamente, (first|1st)
e (fir|1)st significam a mesma coisa.
Eis um exemplo envolvendo uma soletrao alternativa do meu nome. Compare e con-
traste as seguintes trs expresses, as quais so, efetivamente, iguais:
Jeffrey|Jeffery
Jeff(rey|ery)
Jeff(re|er)y
Para combin-las com a ortografia Britnica tambm, elas seriam:
(Geoff|Jeff)(rey|ery)
(Geo|Je)ff(rey|ery)
(Geo|Je)ff(re|er)y
Por fim, observe que essas trs combinaes so iguais a mais longa (porm mais sim-
ples) Jeffrey|Geoffery|Jeffery|Geoffrey. Todas elas so maneiras diferentes de especifi-
car as mesmas combinaes desejadas.
Ainda que os exemplos gr[ea]y comparado com gr(a|e)y possam embaar a distino,
tenha cuidado para no confundir o conceito de alternncia com aquele de uma classe de
caracteres. Uma classe de caracteres pode combinar com apenas um nico caractere no
texto alvo. Com a alternncia, visto que cada alternativa pode ser uma expresso regular
totalmente desenvolvida, dentro e fora de si mesma, cada alternativa pode combinar com
uma quantidade arbitrria de texto. As classes de caracteres so quase como a sua prpria
mini linguagem especial (por exemplo, com as suas prprias ideias sobre metacaracte-
res), enquanto que a alternncia parte da linguagem principal de expresso regular.
Voc descobrir que ambas so extremamente teis.
Tambm preciso tomar cuidado ao usar o circunflexo ou o cifro em uma expresso
que tenha alternncia. Compare ^From|Subject|Date: com ^(From|Subject|Date):.
Ambas parecem semelhantes ao nosso exemplo anterior de e-mail, mas o que cada uma
combina (e, portanto, o quo til ), difere muito. A primeira composta de trs alterna-
tivas, assim, ela combina com From, Subject ou Date:, o que no especialmente
til. Queremos o circunflexo inicial e o : final para aplicar a cada alternativa. Ns po-
demos conseguir isso, usando parnteses para restringir a alternncia:
^(From|Subject|Date):
A alternncia restrita pelos parnteses, assim, literalmente, essa regex significa combinar
com o incio da linha, depois com um de From, Subject ou Date e depois, combinar com
Recordao das convenes tipogrficas da pgina xix, em que como s vezes eu mostro um caractere
de espao, de modo que ele possa ser visto com facilidade.
Metacaracteres Egrep 13
Eis um exemplo:
% egrep ^(From|Subject|Date): mailbox
From: elvis@tabloid.org (The King)
Subject: be seein ya around
Date: Mon, 23 Oct 2006 11:04:13
From: The Prez president@whitehouse.gov
Date: Wed, 23 Oct 2006 8:36:24
Subject:
. now, about your vote
.
.
Isso apresenta todas as linhas que combinamos anteriormente, mas tambm inclui linhas
como:
SUBJECT: MAKE MONEY FAST
Com bastante frequncia, eu me vejo usando a opo i (talvez devido relao com
a nota de rodap da pgina 11!), portanto, recomendo ter isso em mente. Em captulos
posteriores, veremos outros recursos de suporte convenientes.
Limites de Palavra
Um problema comum que uma expresso regular que combina a palavra desejada,
com frequncia tambm pode combinar onde a palavra est embutida em uma palavra
maior. Mencionei isso rapidamente nos exemplos cat, gray e Smith. Mas, acontece que
algumas verses de egrep oferecem suporte limitado ao reconhecimento de palavra: no-
meadamente, a habilidade de combinar o limite de uma palavra (onde uma palavra se
inicia e termina).
Voc pode usar as meta strings \< e \> (talvez de aparncia estranha), se por acaso a sua ver-
so suport-las (nem todas as verses de egrep o fazem). possvel pensar nelas como verses
de ^ e $ baseadas em palavras, que combinam a posio no incio e no fim de uma palavra,
respectivamente. Como as ncoras de linha, circunflexo e cifro, elas ancoram outras partes da
expresso regular, mas, na verdade no usam quaisquer caracteres durante uma combinao.
A expresso <\cat\> significa, literalmente, combinar, se pudermos encontrar uma posio
de incio de palavra, imediatamente seguida por c-a-t, logo depois seguida por uma posio de
14 Captulo 1: Introduo a Expresses Regulares
fim de palavra. Com mais naturalidade, ela significa encontrar a palavra cat. Se voc quisesse,
poderia usar / < cat ou cat\> para encontrar palavras comeando e terminando com cat.
Observe que sozinhos, < e > no so metacaracteres quando combinadas com uma
barra invertida, as strings tornam-se especiais. Por isso que as chamei de meta strings.
A interpretao especial delas importante, no a quantidade de caracteres, portanto, na
maioria das vezes eu uso essas duas meta palavras alternadamente.
Lembre-se que nem todas as verses de egrep suportam esses metacaracteres de limite
de palavra, e aquelas que no entendem, magicamente, o idioma ingls. O incio de uma
palavra simplesmente a posio onde comea uma string de caracteres alfanumricos;
fim de palavra onde tal string termina. A Figura 1-2, mostra uma linha de exemplo
com essas posies marcadas.
Os incios de palavras (conforme egrep os reconhece) esto marcados com setas para
cima, os finais de palavras com setas para baixo. Como possvel ver, incio e fim de pa-
lavra dito mais claramente como incio e fim de uma string alfanumrica, mas talvez,
isso seja muita conversa.
Resumidamente
A Tabela 1-1 resume os metacaracteres que vimos at agora.
Tabela 1-1: Resumo de Metacaracteres Vistos At Agora
Metacaractere Nome Combina
. ponto qualquer caractere
[ ] classe de caractere qualquer caractere relacionado
[^ ] classe de caractere de nega- qualquer caractere no relacionado
o
^ circunflexo a posio no incio da linha
$ cifro a posio ao final da linha
\< barra invertida, menor que
a posio no incio de uma palavra
\>
barra invertida, maior que
a posio ao final de uma palavra
no suportado por todas as verses de egrep
| ou, barra combina com qualquer expresso que ela separa
( ) parnteses usado para limitar o escopo de |, alm de usos
adicionais que ainda sero abordados
ractere fora de uma classe, mas no dentro de uma. Ao contrrio, um trao (normalmente)
um metacaractere dentro de uma classe, mas no fora. Alm do mais, um circunflexo tem
um significado fora e um outro especificado dentro de uma classe imediatamente aps a
abertura [, e um terceiro significado se fornecido em qualquer outro lugar na classe.
No confunda alternncia com uma classe de caracteres. A classe [abc] e a alternncia
(a|b|c) significam, efetivamente, a mesma coisa, mas a semelhana neste exemplo
no se estende ao caso em geral. Uma classe de caractere pode combinar exatamente
um caractere, e isso verdade, independente de quo longa ou curta possa ser a lista
especificada de caracteres aceitveis.
Por outro lado, a alternncia pode ter longas alternativas arbitrrias, cada qual textual-
mente no relacionada com a outra: \<(1,000,000|million|thousandthou)\>. Entre-
tanto, a alternncia no pode ser invalidada como uma classe de caractere.
Um caractere de negao simplesmente uma convenincia de notao para uma classe
de caractere normal que combina com qualquer coisa que no esteja relacionada. Assim,
[^x] no significa combinar a menos que haja um x, e sim combinar se houver algo
que no seja x. Apesar de sutil, a diferena importante. Por exemplo, o primeiro con-
ceito combina uma linha em branco, enquanto que [^x] no combina.
A til opo i ignora letras maisculas e minsculas durante uma combinao
(13).
O que vimos at agora pode ser bastante til, mas a verdadeira fora vem dos elementos
opcionais e de contagem, que veremos a seguir.
Itens Opcionais
Vejamos a combinao de color ou colour. Visto que ambas so iguais, exceto que uma
tem um u e a outra no, podemos usar colou?r para combinar com qualquer uma. O
metacaractere ? (ponto de interrogao) significa opcional. Ele colocado depois de um
caractere que tem permisso de aparecer naquele ponto da expresso, porm, cuja exis-
tncia no exigida, de fato, para ser considerada uma combinao bem sucedida.
Diferente de outros metacaracteres que vimos at agora, o ponto de interrogao s
combina com o item imediatamente precedente. Assim, colou?r interpretado como c,
depois o, depois l, depois o, depois u? e depois r.
A parte u? sempre bem sucedida: s vezes, ela combina com um u no texto, enquanto
que em outras vezes no combina. A questo toda que a parte opcional-? considerada
bem sucedida de qualquer das maneiras. Isso no significa que qualquer expresso re-
gular que contm ? sempre bem sucedida. Por exemplo, com 'semicolor', ambos, colo
e u?, so bem sucedidos (combinando colo e nada [vazio], respectivamente). Porm,
o final r falha e isso que no permite o semicolon no final, de ser combinado por
colou?r.
Como um outro exemplo, imagine combinar uma data que represente quatro de Julho,
com a parte July sendo July ou Jul e a parte fourth sendo fourth, 4th [4] ou apenas 4.
Recordando as convenes tipogrficas (pgina xix), que s vezes se parece como 13, trata-se de uma abre-
viao para uma referncia outra pgina neste livro.
16 Captulo 1: Introduo a Expresses Regulares
ser desenhada pela tela. Como no exemplo de <H3>, os espaos opcionais so permitidos
antes da chave angular de fechamento. Alm disso, eles so permitidos em ambos os lados
do sinal de igualdade. Finalmente, exigido um espao entre o HR e o SIZE, embora se-
jam permitidos mais. Para permitir mais, poderamos simplesmente acrescentar * ao * j
existente, mas, em vez disso, vamos mud-lo para +. O sinal de adio permite espaos
extras enquanto ainda exige pelo menos um, portanto, na realidade, para ser conciso ele
igual a *. Todas essas alteraes nos deixam com <HR+SIZE*=*14*>.
Embora flexvel com relao a espaos, a nossa expresso ainda inflexvel com relao
ao tamanho dado na tag. Em vez de encontrar tags apenas com um tamanho em especial,
tal como 14, ns queremos encontr-las todas. Para conseguir isso, substitumos o 14 por
uma expresso para encontrar um nmero geral. Bem, neste caso, um nmero consiste
de um ou mais dgitos. Um dgito [0-9] e adiciona um ou mais, portanto, acabamos
substituindo 14 por [0-9]+. (Um caractere de classe uma unidade, assim, pode estar
diretamente sujeito a um sinal de adio, ponto de interrogao e assim por diante, sem
a necessidade de parnteses.)
Isto nos deixa com <HR+SIZE*=*[0-9]+*>, o que por certo muita coisa, ainda que
tenha sido mostrado com os metacaracteres em negrito, com o acrscimo de um pouco de
espaamento para tornar o agrupamento mais claro e eu esteja usando o smbolo visvel
de espao, , para clareza. (Felizmente, egrep tem a opo i case-sensitive, 13, o que
significa que no preciso usar [Hh] [Rr] em vez de HR.) A expresso regular sem enfeites
<HR +SIZE *= *[0-9]+ *>, provavelmente parece at mais complicada. Este exemplo parece
bem estranho, porque os assuntos da maioria das estrelas e sinais de adio so caracteres
de espao e o nosso olhar sempre foi treinado para tratar os espaos como especiais. Esse
um costume do qual voc ter que se afastar ao ler expresses regulares, pois o caractere
de espao um caractere normal, sem diferena de digamos, j ou 4. (Em captulos posterio-
res, veremos que algumas outras ferramentas suportam um modo especial, no qual espao
em branco ignorado, mas, egrep no possui tal modo.)
Prosseguindo na explorao de um bom exemplo, vamos imaginar que o atributo de tamanho
seja opcional, portanto, voc pode simplesmente usar <HR> se for desejado o tamanho padro.
(Como sempre, espaos extras so permitidos antes de >.) Como podemos modificar a nossa
expresso regular para que ela combine com qualquer tipo? A chave est em perceber qual
parte do tamanho opcional (esta uma dica). Vire a pgina para conferir a sua resposta.
D uma boa olhada em nossa ltima expresso (na caixa de resposta), para verificar as di-
ferenas entre o ponto de interrogao, a estrela e o sinal de adio, e o que eles realmente
significam na prtica. A Tabela 1-2, resume o significado deles.
Observe que cada quantificador tem algum nmero mnimo de combinaes exigido para
ser bem sucedida, e uma quantidade mxima de combinaes que sempre tentar fazer.
Com algumas, o nmero mnimo zero; com outras, o nmero mximo ilimitado.
Se voc no estiver familiarizado com HTML, no tema. Eu uso esses exemplos de mundo real, mas forneo todos
os detalhes necessrios para entender as aes tomadas. Aqueles que esto familiarizados com a anlise de tags [tags]
HTML, provavelmente reconhecero informaes importantes que no abordo a esta altura do livro.
18 Captulo 1: Introduo a Expresses Regulares
Observe que o final * mantido fora do (...)?. Isso ainda permitir algo como
<HR>. Se tivssemos includo entre parnteses, os espaos finais s teriam sido per-
mitidos quando o size do componente estivesse presente.
Da mesma forma, note que o + antes de SIZE includo entre parnteses. Se ele
fosse deixado fora deles, seria exigido um espao depois do HR, mesmo se a poro
SIZE no estivesse presente. Isso levaria <HR> a no combinar.
Mnimo Mximo
Exigido a Tentar Significado
? nenhum 1 um permitido; nenhum exigido (um opcional)
* nenhum sem limite permisso ilimitada; nenhum exigido (qualquer quantia OK)
+ 1 sem limite permisso ilimitada; um exigido (pelo menos um)
meta strings de limite de palavra \<...\> mencionadas na pgina 14: \<thethe\>. Pode-
ramos usar + para o espao, para maior flexibilidade.
No entanto, ter que verificar cada possvel par de palavras seria uma tarefa impossvel.
No seria bom se pudssemos combinar uma palavra genrica e depois dizer agora,
combina novamente a mesma coisa? Se o seu egrep suportar referncia anterior, pos-
svel. A referncia anterior um recurso de expresso regular que lhe permite combinar
novo texto que igual a algum texto combinado anteriormente na expresso.
Comeamos com \<the+the\> e substitumos o the inicial por uma expresso regular,
para combinar uma palavra geral, como [A-Za-z]+. Depois, por motivos que ficaro cla-
ros no prximo pargrafo, colocamos parnteses em volta dela. Por fim, substitumos o
segundo the pela meta string especial \1. Isso produz \<([A-Za-z]+)+\1\>.
Com ferramentas que suportam referncias anteriores, os parnteses lembram o texto
com o qual a subexpresso dentro deles combina, e a meta string especial \1 representa
aquele texto posteriormente na expresso regular, sempre que for a hora.
Logicamente possvel ter mais de um conjunto de parnteses em uma expresso regu-
lar. Use \1, \2, \3, etc, para referenciar o primeiro, segundo, terceiro, etc. conjuntos.
Os pares de parnteses so numerados contando os parnteses de abertura a partir da
esquerda, portanto, com ([a-z])([0-9])\1\2, o \1 refere-se ao texto combinado por [a-z]
e \2 refere-se ao texto combinado por [0-9].
Com o nosso exemplo thethe, [A-Za-z]+ combina com o primeiro the. Ele est dentro
do primeiro conjunto de parnteses, portanto, o the combinado torna-se disponvel atra-
vs de \1. Se o + seguinte combinar, o \ 1 subsequente exigir um outro the. Se \1
for bem sucedido, ento \> garante que agora estamos no limite do final de uma palavra
(o que no aconteceria se houvesse o texto thetheft). Se bem sucedido, encontramos
uma palavra repetida. Nem sempre o caso em que que h um erro (tal como com que
nesta sentena), mas voc quem decide quando linhas suspeitas so exibidas.
Quando resolvi incluir este exemplo, na verdade eu o experimentei no que tinha escrito
at ento. (Usei uma verso de egrep que suporta ambos, \<...\> e referncia anterior.)
Para torn-lo mais til, de modo que Thethe tambm pudesse ser encontrado, usei a
opo i case-sensitive mencionada na pgina 13.
Eis o comando que executei:
% egrep i \<([a-z]+) +\1\> files [arquivos]
Fiquei surpreso de encontrar catorze conjuntos de palavras erroneamente repetidas-re-
petidas! Eu as corrigi e, desde ento, tenho montado esse tipo de expresso regular de
verificao nas ferramentas que uso para produzir a sada final deste livro, para garantir
que no ficasse nenhum escorrego.
Ainda que essa expresso regular seja to til, importante entender as suas limitaes.
Visto que egrep considera isoladamente cada linha, no consegue encontrar quando o
final de palavra de uma linha repetido no incio da prxima. Por isso, necessria uma
ferramenta mais flexvel, e no prximo captulo veremos alguns exemplos.
Esteja ciente de que algumas verses de egrep, inclusive verses mais antigas oferecidas do popular GNU,
causam um bug [mau funcionamento] com a opo i, de modo que no se aplicam a referncias anteriores.
Assim ele encontra the the, mas no The the.
20 Captulo 1: Introduo a Expresses Regulares
O timo Escape
Uma coisa importante que ainda no mencionei como, de fato, combinar um carac-
tere que, normalmente, uma expresso regular interpretaria como um metacaractere.
Por exemplo, se eu buscasse por um hostname [nome de hospedeiro / domnio] da
Internet ega.att.com usando ega.att.com, ele poderia acabar combinando algo como
megawattcomputing. Lembre-se, . um metacaractere que combina com qualquer
caractere, inclusive um espao.
A meta string para combinar com um ponto um ponto precedido de uma barra inver-
tida: ega\.att\.com. A string \. descrita como um escaped period ou escaped dot
[ponto de escape] e possvel fazer isso com todos os metacaracteres normais, exceto em
uma classe de caracteres.
Uma barra invertida usada dessa maneira chamada de escape quando um meta-
caractere escapa, ele perde o seu significado especial e se transforma em um caractere
literal. Se voc quiser, pode considerar a string como uma meta string especial para com-
binar com o caractere literal. tudo a mesma coisa.
Como um outro exemplo, voc poderia usar \([a-zA-Z]+\) para combinar com uma
palavra entre parnteses, tal como (very) [muito]. As barras invertidas nas strings \ (
e \ ) removem a interpretao especial dos parnteses, deixando-os como literais para
combinar com os parnteses no texto.
Quando usada antes de um no metacaractere, uma barra invertida pode ter diferentes
significados, dependendo da verso do programa. Por exemplo, j vimos como algumas
verses tratam \<, \>, \1, etc. como meta strings. Veremos muitos outros exemplos
nos prximos captulos.
Alm do Fundamental
Espero que os exemplos e as explicaes dadas at agora tenham ajudado a estabelecer
a base para uma compreenso slida de expresses regulares, mas, por favor, note que o
oferecido no tem profundidade. H muito mais l fora.
Diversificao Lingustica
Eu mencionei uma srie de recursos de expresso regular que a maioria das verses de
egrep suporta. Existem outros recursos, alguns dos quais no so suportados por todas as
verses, o que deixarei para captulos posteriores.
Infelizmente, a linguagem de expresso regular no diferente de qualquer outra, pelo
fato de ter diversos dialetos e sotaques. Parece que cada novo programa empregando
expresses regulares concebe seus prprios aperfeioamentos. O moderno avana con-
tinuamente, porm, com os anos as alteraes resultaram em uma ampla gama de sabo-
res de expresso regular. Nos prximos captulos veremos muitos exemplos.
A maioria das linguagens de programao e de ferramentas permite que voc tambm escape caracteres dentro
de uma classe de caracteres, porm, a maioria das verses de egrep no o faz, ao invs disso, trata \ dentro de
uma classe, como uma barra invertida literal a ser includa na lista de caracteres.
Ampliando a Base 21
aspas duplas dentro da string se elas forem escapadas com uma barra invertida, tal como em
nailthe2\x4\plank. Em futuros captulos, veremos este exemplo diversas vezes enquan-
to abordarmos os muitos detalhes de como , realmente, realizada uma combinao.
Quantia em dlar (com opo de centavos)
Uma abordagem para combinar uma quantia em dlar : \$[0-9]+(\.[0-9][0-9])?.
A partir de uma perspectiva de nvel superior, esta uma expresso regular simples, com
trs partes: /$, ...+ e (...)?, que poderia ser vagamente parafraseada como um sinal
literal de dlar, um punhado de uma coisa e, finalmente, talvez uma outra coisa. Nesse
caso, a uma coisa um dgito (com um punhado deles sendo um nmero), e uma outra
coisa a combinao de um ponto decimal seguido por dois dgitos.
Este exemplo um pouco ingnuo por diversos motivos. Por exemplo, ele considera quantias
de dlar como $1000, e no como $1,000. Ele permite a opo de centavos, mas sinceramen-
te, isso no realmente muito til quando aplicado com egrep. O egrep nunca se preocupa
exatamente com quanto combinado, mas apenas se h uma combinao. Para incio de
conversa, permitir alguma coisa ao final nunca altera se h uma combinao total.
Entretanto, se voc precisar encontrar linhas que contenham apenas um preo e nada
mais, possvel envolver a expresso com ^...$. Nesse caso, a parte da opo de centa-
vos se torna importante, visto que ela poderia ou no ficar entre a quantia em dlar e o
fim da linha, e permiti-la ou no faz a diferena em conseguir uma combinao total.
Um tipo de valor que a nossa expresso no combina $.49. Para resolver isso, voc
poderia ficar tentado a mudar o sinal de adio para uma estrela, mas isso no funcio-
naria. Quanto ao motivo, eu o deixarei como uma provocao, at vermos um exemplo
semelhante no Captulo 5 ( 177).
Uma URL HTTP / HTML
O formato de URLs da web pode ser complexo, assim, montar uma expresso regular
para combinar com qualquer possvel URL pode ser igualmente complexo. No entanto,
diminuindo ligeiramente os seus padres pode possibilitar que voc combine a maioria
dos URLs comuns com uma expresso bem simples. Por exemplo, um motivo comum
pelo qual eu faria isso seria buscar meu arquivo de e-mail quanto a um URL que me lem-
bro vagamente de ter recebido, mas que acredito poder reconhecer quando o vir.
A forma geral de um URL HTTP /HTML do tipo de
http://hostname/path.html
embora o final com .htm tambm seja comum.
As regras sobre o que pode e o que no pode ser um hostname [endereo na web, tal
como www.yahoo.com) so complexas, mas, para as nossas necessidades, podemos per-
ceber que se ele seguir http://, provavelmente um nome de hospedeiro, assim, pode-
mos ficar com algo simples, tal como [-a-z0-9_.1]+. A parte de caminho pode ser ainda
mais variada, assim, para isso usaremos [-a-z0-9_:@&?=+,.!/~*%$]*. Observe que essas
classes tm o trao primeiro, para garantir que ele seja tomado como um caractere literal
e includo na lista, em oposto poro de uma faixa ( 8).
Juntando tudo isso, poderamos usar como nossa primeira tentativa, algo assim:
% egrep i '\< http://[-a-z0-9_.:]+/[-a-z0-9_:@&?=+,.!/~*%$]*\.html?\>
Ampliando a Base 23
De novo, visto que tomamos liberdades e relaxamos quanto ao que iremos combinar, po-
demos muito bem combinar algo tal como http://. . . . /foo.html, o que certamente no
um URL vlido. Estamos preocupados com isso? Tudo depende do que voc est tentando
fazer. Para a varredura do meu arquivo de e-mail, de fato no importa se eu tiver algumas
combinaes falsas. Com os diabos, possivelmente eu poderia ficar com uma coisa to
simples quanto:
... % egrep i '\<http://[^ ]*\.html?\>'arquivos
Como aprenderemos ao nos aprofundar mais em como moldar uma expresso, saber os
dados que voc buscar uma questo importante para encontrar o equilbrio entre com-
plexidade e perfeio. Voltaremos a este exemplo, em mais detalhes, no prximo captulo.
Uma tag HTML
Com uma ferramenta como egrep, no parece especialmente normal ou til apenas com-
binar linhas com tags HTML. No entanto, explorar uma expresso regular que combina
exatamente tags HTML pode ser proveitoso, em particular quando nos aprofundarmos em
ferramentas mais avanadas, no prximo captulo.
Vendo situaes simples, como <TITLE> e <HR>, poderamos pensar em experimentar
<.*>. Essa abordagem simplista um primeiro pensamento frequente, mas com certeza
no o certo. Converter <.*> para o ingls, significa combinar um < seguido por muito
de qualquer coisa que possa ser combinado, seguido por >. Bem, quando dito desta
forma, no se trataria de uma surpresa poder combinar com mais do que apenas uma tag,
tal como a poro marcada de this <I>short</I> example.
Isso poderia ter sido um pouco surpreendente, porm, ainda estamos no primeiro ca-
ptulo e o nosso conhecimento, a esta altura, apenas superficial. Mostro este exemplo
aqui para destacar que as expresses regulares no so um assunto difcil, mas que elas
podem ser ardilosas se voc no entend-las verdadeiramente. No decorrer dos prximos
captulos, veremos todos os detalhes exigidos para entender e solucionar este problema.
Hora do dia: tal como 9:17 am ou 12:30 pm
A combinao de uma hora pode ser feita em nveis variveis de rigidez. Algo como
[0-9]?[0-9]:[0-9][0-9](am|pm)
envolve ambas, 9:17am e 12:30pm, mas tambm permite algo sem sentido, como
99:99pm.
Olhando a hora, percebemos que se ela tiver um nmero de dois dgitos, o primeiro dgito
deve ser o um. Mas, 1?[0-9] ainda permite uma hora de 19 (e tambm uma hora de 9), por-
tanto, talvez fosse melhor quebrar a parte da hora em duas possibilidades: 1[012] para ho-
ras de dois dgitos e [1-9] para horas de um nico dgito. O resultado (1[012] | [1-9]).
A parte dos minutos mais fcil. O primeiro dgito deve ser [0-5]. Para o segundo, pode-
mos ficar com o atual [0-9]. Ao juntar tudo, isso d (1[012] | [1-9]):[0-5][0-9](am | pm).
Usando a mesma lgica, voc pode estender isso para lidar com o horrio de 24 horas,
com horas de 0 a 23? Como um desafio, possibilite um zero frente, pelo menos at 09:59.
Experimente montar a sua soluo e depois vire a pgina para conferir com a minha.
24 Captulo 1: Introduo a Expresses Regulares
Combinando
Quando digo que uma regex combina com uma string, de fato, quero dizer que ela combina
em uma string. Tecnicamente, a regex a no combina com cat, mas combina em um cat. No
uma coisa que as pessoas podem confundir, mas ainda vale pena mencionar.
Metacaractere
Se um caractere um metacaractere (ou meta string eu uso as palavras alternadamente)
depende de exatamente onde a regex usada. Por exemplo, * um metacaractere, mas,
s quando no est dentro de uma classe de caractere e quando no escapado. Escapado
significa que ele tem uma barra invertida sua frente em geral. A estrela est escapada em
\* mas no em \\* (onde a primeira barra invertida promove a fuga da segunda), ainda
que a estrela tenha uma barra invertida sua frente nos dois exemplos.
Dependendo do sabor da regex, existem diversas situaes em que determinados carac-
teres so e no so metacaracteres. O Captulo 3 aborda isto em mais detalhes.
Sabor
Conforme sugeri, diferentes ferramentas usam as expresses regulares para muitas coisas
diferentes e o conjunto de metacaracteres e outros recursos que cada um suporta podem
diferir. Vejamos novamente os limites de palavra como um exemplo. Algumas verses de
egrep suportam a notao \<...\> que vimos. No entanto, algumas no suportam incio
de palavra e final de palavra separado, mas um metacaractere que captura tudo \b (que
ainda no vimos veremos no prximo captulo). Outras ainda suportam ambos e muitas
outras no suportam nenhum.
Eu uso o termo sabor para descrever a soma total de todas essas pequenas decises
de implementao. Na analogia de idioma, o mesmo que um dialeto de um orador in-
dividual. Superficialmente, esse conceito refere-se a quais metacaracteres so e no so
suportados, porm, h muito mais nele. Mesmo se dois programas suportarem \<...\>,
eles podem discordar sobre exatamente o que podem fazer, e no considerar ser uma
palavra. Essa preocupao importante quando voc usa a ferramenta.
Voc tambm poderia cruzar com regexp, decididamente de pssima aparncia. No sei como algum pode
pronunciar isso, mas aqueles com ceceio [N. da T. - que pronunciam as palavras com a ponta da lngua apoiada
nos dentes] podem achar um pouco mais fcil.
Ampliando a Base 25
[01]?[0-9]|2[0-3] [01]?[4-9]|[012]?[0-3]
00 01 02 03 04 05 06 07 08 09 0 1 2 3 4 5 6 7 8 9
00 01 02 03 04 05 06 07 08 09 00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19 10 11 12 13 14 15 16 17 18 19
20 21 22 23 20 21 22 23
No confundabut
supported, sabor commuch
theres ferramenta.
more to Assim como ifduas
it. Even twopessoas podem
programs falarsupport
both o mesmo
dialeto, dois programas totalmente diferentes podem suportar o mesmo sabor de regex. Da
! \<\>", they might disagree on exactly what they do and dont consider to be a
mesma forma, dois programas com o mesmo nome (e criados para executar a mesma tare-
word. This concern is important when you use the tool.
fa), com frequncia tm sabores ligeiramente diferentes (e s vezes, nem to ligeiramente).
Dentre os diversos
Dont confuse programas
avor chamados
with tool. Justdeasegrep, existe uma
two people can ampla
speak variedade
the same de sabores
dialect,
regex suportados.
two completely different programs can support exactly the same regex avor.
NoAlso, two
final da programs
dcada de with 1990, the samesignificativo
o sabor name (andoferecido
built to pela
do the same task)
linguagem often
de programa-
o
havePerl era largamente
slightly reconhecido
(and sometimes pelo seu poder
not-so-slightly) e, logo,
different outras
avors. linguagens
Among estavam
the various
oferecendo
programs calledexpresses
egr ep, regulares
there is a inspiradas
wide variety emofPerl (muitas
regex avorsatsupported.
mesmo reconhecendo
a fora de inspirao, rotulando-se como compatveis com Perl). As que adotaram in-
In thePHP,
cluem late Python,
1990s, themuitosparticularly expressive
pacotes regex avorFramework
Java, .NET offered bydathe Perl program-
Microsoft, Tcl e uma
mingde
srie language
bibliotecaswasC,widely recognized
mencionando apenasforalgumas.
its power, andassim,
Ainda soon todas
other so
languages
diferentes
emweraspectos
e offering importantes.
Perl-inspirAlm disso, as
ed regular expresses(many
expressions regulares
evende acknowledging
Perl esto evoluindothe e
crescendo
inspirational (e agora,
sources by vezes, em resposta
labeling aos avanos
themselves notados em outras
Perl-compatible). The ferramentas).
adopters
Como
include sempre, a viso geral
PHP, Python, manycontinua
Java regexa sepackages,
tornar mais variada e .confusa.
Microsofts NET Framework, Tcl,
and a variety of C libraries, to name a few. Yet, all are different in important
Subexpresso
respects. On top of this, Perls regular expressions themselves are evolving and
O termo subexpresso
growing (sometimes, now, refere-se,
in simplesmente, parte de uma
response to advances seen expresso
with other maior, aindaAsque
tools).
geralmente se refira a alguma parte de uma expresso entre parnteses
always, the overall landscape continues to become more varied and confusing. ou, a uma alternativa
de |. Com ^(Subject|Date):, por exemplo, Subject|Date referenciada como uma subex-
presso. Neste contexto, cada uma das alternativas, Subject e Date tambm so referidas como
subexpresses. Tecnicamente, entretanto, S uma subexpresso, assim como u,b e j ...
The term subexpr Theession
term subexpr simply refers ession to simply
part of refers a larger to expression,
part of a larger although it
expression, alth
often refers to some oftenpart refers of to
an some expression part ofwithin parentheses,
an expression within or to an alternative
parentheses, or to an alt
of !;". For example, of !;." with For !example,
( Subject;Date with ! (): ", the ! Subject;Date
Subject;Date ): ", the " ! Sisubject;Date
usually " is
26 referred to as a subexpression. Captulo 1: Introduo a Expresses Regulares
referred to as aWithin subexpression.that, the alternatives
Within that, ! Sthe ubject " and ! Date
alternatives ! Subject " are " and ! D
each referred to each as subexpressions
referred to as as well. But technically,
subexpressions as well. But! S " is technically,
a subexpression, ! S " is a subexp
as is ! u" , and ! b" , and
as !
is j" ,
! u" .
, . .
and ! b" , and ! ,
j"
Algo como 1-6 no considerado uma subexpresso de H[1-6]*, visto que 1-6 faz par- . . .
te de uma Something
unidade inquebrvel, as 1-6 aisnt
such Something classe de caracteres.
considered Mas, H, [1-6]
a subexpression e * so+ ",todas
such as 1-6 isnt considered aofsubexpression
! H[1-6] since
of ! H[1-6] the + ", s
subexpresses de H[1-6]*.
1-6 is part of an 1-6unbreakable
is part of an unit, the character
unbreakable unit, class.
the But, ! H ", ![1-6]"
character class., and
But, ! ! H+"," ![1-6]",
Diferente de
arealternncia,
all subexpressions osarquantificadores
e all of ! H[1-6] (estrela,
subexpressions + ". of ! Hsinal [1-6] de +adio
". e ponto de interro-
gao) sempre funcionam com a menor subexpresso imediatamente precedente. Assim,
Unlike
com mis+pell , o alternation,
+ regula Unlike o quantiers
s no alternation,
o mis (star,ouquantiers
plus,
is. and question
claro (star,
que, plus,mark)
and always
quando o quework
question mark)
precedewith the work
always
smallest immediately-preceding
imediatamente um quantificador smallest uma subexpression.
immediately-preceding
subexpresso entre parnteses, This is why
subexpression. with
todaThis ! m is+pell ,
" the
is why with +! mis+pel
a subexpres-
gover
so aceita como ns uma the ! s"unidade
, not
goverthe(independente
the or
ns! mis" not. Of
! s", ! is" thedecourse,
!m is " or
quo when
! is ." Of
complexa what immediately
course,
for). when what precedes
immediately a pre
quantier is a parenthesized quantier is asubexpression, parenthesized the entire subexpr
subexpression, theessionentire(no subexpr matter ession (no
Caractere how complex) ishow taken as one unit.
complex) is taken as one unit.
A palavra caractere pode ser um termo carregado em computao. O caractere que
Character simplesmente
um byte representa Characteruma questo de interpretao. Um byte com deter-
minado valor tem aquele mesmo
The word characterThe word valorcharacter
can beema qualquer
loadedcan contexto
termbe in que pelo
termqual
computing.
a loaded The voc possathat
character
in computing. Thea characte
consider-lo, mas qual caractere
byte represents is representa qual valor depende da codificao na
byte represents is merely a matter of interpretation. A byte withasuch-and
merely a matter of interpretation. A byte with qual
such-and-such
ele visto.value
Como hasum exemplo
that same concreto, dois bytes com valores you decimais deto64consider
e 53 it,
valuevalue in any
has that samecontext
valueininwhich
any context might wish
in which you might wish to con
representam os caracteres @ e 5, respectivamente, se considerados na codificao
but which character that value
but which repr esents
character depends
that value repron the depends
esents encodingon in the
which its
encoding in w
ASCII [American National Standard Code For Information Interchange, embora por outro
viewed. As a concrete
viewed. example,
As a two bytes
concrete with decimal
example, two values
bytes with 64 and 53
decimal repre-64 and 5
values
lado sejam completamente diferentes, se considerados na codificao EBCDIC [Extended
sentDecimal
Binary Coded the characters
sent@
theand
Interchange Code 5 respectively,
characters @ and
Cdigo if considered
5
estendido respectively, in ifthe
de caracteres ASCII encoding,
considered
decimais co-in the ASCII en
yet on the other hand are completely
yet on the other
dificados em binrio para intercmbio differ ent if
hand are completely
de informaes] considered
(se tiverem differ in
ument the EBCDIC
if considered
espao e algum encod-
in the EBCDIC
tipo de uming (they are
caractere de acontrole).
space and are
ing (they some kind of
a space a control
and some kind character).
of a control character).
Ainda por On
outro thelado,
thirdsehand,On ifthe
aqueles those
dois
third two
bytes bytes
hand,forem are consider
considerados
if those two bytesed em
inareone
uma of
das
considerthe popular
in oneencod-
codificaes
ed of the popula
ings for Japanese characters,
ings for together
Japanese they
characters, repr
populares para caracteres em Japons, juntos, eles representam um nico caractere, esent
together the
they single
repr character
esent the a.
singleYet,character
to repr esent this same
to repr character
esent this in another
same of
character
. Mesmo assim, para representar esse mesmo caractere em uma outra codificao em the inJapanese
another encodings
of the requir
Japanese es two
encodings requ
completely differ ent bytes. Those
completely differdiferentes.
Japons requer dois bytes completamente two differ
ent bytes.AThose ent bytes, by
two differ
propsito, the
essesent way, yield
doisbytes,
bytesby the two
the way, yield
dife-
characters
rentes possibilitam os
dois in the popular
caracteres
characters Latin-1
na the encoding,
in popular popular but yield
codificao
Latin-1 the one
Latim-1,
encoding, mas Korean
butpermitem charac-
yield the one Korean
ter k in
o nico caractere emone ofter
Coreano thekUnicode
,innas
one encodings.
codificaes
of the UnicodedeThe point isA this:
Unicode.
encodings. questo
Thehow bytes
esta:
point are to
iscomo
this: howbe bytes a
os bytes devem
interprseretedinterpretados
matter eted
is a interpr ofuma isquesto
a matterde
perspective ofperspectiva
(called (chamada
an encoding),
perspective (calledand de to
an umabecodifi-
successful,
encoding), and to be su
cao), e para
youveseremgotbem sucedidos
to makeyouve sure gotvoc
that precisa
to your
make garantir
perspective
sure que aperspective
agrees
that your suawithperspectiva
the agrees esteja
perspective detaken
with the perspectiv
acordo com byatheperspectiva
tool youre assumida
using. pela ferramenta
by the tool youre using. em que estiver trabalhando.
At recentemente, as ferramentas de processamento de texto tratavam, de maneira geral, seus
dados como punhados de bytes ASCII, sem preocupao com a codificao que voc pode-
ria pretender.
TheEntretanto,
denitive recentemente,
book mais
on multiple-byte
The denitive bookeencodings
mais sistemas esto
is Ken Lundes
on multiple-byte usando
encodings alguma
CJKVis Information
Ken forma
Lundes CJKVde
Processing, also
Information Proce
Unicode parapublished
processar by dados internamente
OReilly. The CJKV
published (o Captulo
by stands for The
OReilly. Chinese,
CJKV3 apresenta
Japanese,
stands for Kor uma
ean,introduo
Chinese, and aoean,
Vietnamese,
Japanese, Kor Uni-
which
and are
Vietnamese,
languages that tend to
code 85). Em orequir
tais sistemas, selanguages
special fonts used in special
e multiple-byte
that tend
subsistema
this book.
encodings.
detoexpresso
requir Ken and encodings.
e multiple-byte
regular Adobe kindly
tiver Kenprovided
and Adobe
sido adequadamente many of the
kindly provided m
fonts used in this book.
implantado, normalmente o usurio no presta muita ateno a esses aspectos. Esse um
grande se, razo pela qual o Captulo 3 comenta esse aspecto em mais profundidade.
encontrar algum que as entende um pouco, mas que no se sente seguro o suficiente
para, de fato, us-las para qualquer coisa complexa ou com qualquer ferramenta, exceto
aquelas usadas com mais frequncia.
Tradicionalmente, a documentao sobre expresso regular tende a ser limitada a uma descri-
o rpida e incompleta de um ou dois metacaracteres, seguidos por uma tabela do restante.
Geralmente, os exemplos usam expresses regulares sem sentido, como a*((ab)*|b*) e tex-
to como axxxcexxxxxxcixxxd. H tambm a tendncia de ignorar completamente
pontos sutis, porm, importantes, e geralmente, reivindicam que seu sabor igual ao de outra
ferramenta bem conhecida, esquecendo quase sempre de mencionar as excees, onde inva-
riavelmente, elas diferem. A posio de documentao sobre regex precisa de ajuda.
Ento, no quero dizer que este captulo preenche a lacuna para todas as expresses
regulares ou mesmo para as expresses regulares de egrep. Ao contrrio, este captulo
apenas oferece a base sobre a qual o resto deste livro construdo. Ele pode ser ambi-
cioso, mas espero que este livro preencha as lacunas para voc. Recebi muitas respostas
gratificantes para a primeira edio, e trabalhei muito duro para tornar esta ainda melhor,
tanto em alcance quanto em profundidade.
Talvez porque a documentao sobre expresso regular, tradicionalmente, tenha sido to
falha, eu sinto que preciso fazer um esforo extra para tornar as coisas especialmente cla-
ras. Pelo fato de querer garantir que voc possa usar as expresses regulares ao mximo
do potencial delas, desejo garantir que voc realmente as entenda.
Isso tanto bom quanto ruim.
bom porque voc aprender como pensar em expresses regulares. Aprender com as di-
ferenas e as peculiaridades, para observar quando confrontado com uma nova ferramenta,
com um sabor diferente. Voc saber como se expressar, at mesmo com um fraco sabor de
expresso regular despojada. Compreender o que torna uma expresso mais eficiente do que
uma outra, e ser capaz de contrabalanar o equilbrio entre complexidade, eficcia e combinar
os resultados. Quando diante de uma tarefa particularmente complexa, voc saber como abrir
caminho atravs de uma expresso como o programa faria, construindo-a na medida em que
prossegue. Em resumo, voc ficar vontade usando as expresses regulares ao mximo.
A questo que a curva de aprendizagem deste mtodo pode ser bem acentuada, com
trs aspectos separados a atacar:
Como so usadas as expresses regulares. A maioria dos programas usa as expresses re-
gulares de algumas maneiras que elas so mais complexas do que egrep. Antes de podermos
abordar em detalhes como escrever uma expresso realmente til, preciso ver as formas
pelas quais as expresses regulares podem ser usadas. Comearemos no prximo captulo.
Recursos de expresso regular. Selecionar a ferramenta adequada para usar quando dian-
te de um problema parece ser metade da batalha, portanto, no quero me limitar a usar
apenas um utilitrio neste livro. Diferentes programas, e geralmente, at diferentes verses
do mesmo programa, oferecem recursos e metacaracteres diferentes. Precisamos pesquisar
o campo antes de entrar nos detalhes de us-las. Este o assunto do Captulo 3.
Como as expresses regulares realmente trabalham. Antes de podermos aprender a
partir de exemplos teis (porm, com frequncia, complexos), precisamos olhar por
trs para entender exatamente como conduzida uma busca de expresso regular.
Como veremos, a ordem em que determinados metacaracteres so verificados pode ser
28 Captulo 1: Introduo a Expresses Regulares
Resumo
A Tabela 1-3 resume os metacaracteres de egrep que vimos neste captulo.
Tabela 1-3: Resumo de Metacaracteres de Egrep
Itens a Combinar com um nico Caractere
Metacaractere Combinaes
. ponto Combina com qualquer caractere
[ ] classe de caractere Combina com qualquer caractere relacionado
[^ ] classe de caractere de ne- Combina com qualquer caractere no relacionado
\char gao Quando char um metacaractere, ou a combinao
caractere de escape escapada no , por outro lado, especial, combina
com o char literal
Itens Anexados para Fornecer Contagem: Os Quantificadores
? interrogao Uma permitida, mas opcional
* estrela Qualquer quantidade permitida, mas todas so op-
+ cionais
{min,max} adio Pelo menos uma exigida; adicionais so opcionais
faixa especificada Min exigida, max permitida
Itens que Combinam uma Posio
^ circunflexo Combina a posio no incio da linha
$ cifro Combina a posio no final da linha
\< limite de palavra Combina a posio no incio de uma palavra
\> limite de palavra Combina a posio no final de uma palavra
Noes Pessoais 29
Outros
| alternncia Combina qualquer expresso que ela separa
( ) parnteses Limita o escopo da alternncia, oferece agrupamen-
\1, \2... to s quantificadores e captura para referncias
anteriores
referncia anterior Combina texto previamente combinado dentro do
primeiro, segundo, etc., conjunto de parnteses.
no suportado por todas as verses de egrep
Noes Pessoais
A tarefa de palavras duplicadas, no incio deste captulo, pode parecer desalentadora,
contudo, as expresses regulares so to poderosas que poderamos solucionar muito do
problema com uma ferramenta to limitada quanto egrep, diretamente no primeiro cap-
tulo. Eu gostaria de preencher este captulo de exemplos brilhantes, mas, porque concen-
trei na base slida para os ltimos captulos, receio que algumas pessoas completamente
novas em expresses regulares possam ler este captulo completo, com todos os avisos,
atenes e regras, etc., e pensar por que me preocupar?.
Certa vez, meus irmos estavam ensinando alguns amigos a jogar schaffkopf, um jogo de
cartas que est na minha famlia h geraes. Ele muito mais excitante do que parece
primeira vista, mas tem uma linha de aprendizado bastante acentuada. Depois de aproxi-
madamente meia hora, a minha cunhada Liz, normalmente um exemplo de pacincia, ficou
frustrada com as regras aparentemente complexas e perguntou No podemos simplesmen-
te jogar canastra? Sim, por fim todos acabaram jogando at bem tarde da noite, inclusive a
Liz. Quando eles tinham sido capazes de ultrapassar a elevao do loop de aprendizagem,
um gosto em primeira mo da excitao foi o bastante para conquistar a todos. Os meus
irmos sabiam que seria assim, mas levou algum tempo e trabalho para chegar ao ponto
onde Liz e os outros, novos no jogo, pudessem apreciar em que estavam entrando.
Pode demorar um pouco para ficar aclimatado com as expresses regulares, ento, at
que voc consiga o verdadeiro gosto com a excitao de us-las para solucionar os seus
problemas, tudo pode parecer um pouco acadmico demais. Se assim for, espero que
voc resista ao desejo de jogar canastra. Quando tiver compreendido a fora que as
expresses regulares oferecem, a pequena quantidade de trabalho gasto em aprend-las
parecer, de fato, bem trivial.