You are on page 1of 30

1

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).

Solucionando Problemas Reais


Saber como manobrar expresses regulares desencadeia foras de processamento que
voc poderia nem mesmo saber que estavam disponveis. Vrias vezes em determinado
dia, as expresses regulares me ajudam a solucionar problemas, tanto os grandes quanto
os pequenos (e com bastante frequncia, alguns que so pequenos e que ficariam gran-
des se no fosse pelas expresses regulares).
Mostrar um exemplo que oferece a chave para solucionar um problema grande e importante
ilustra claramente o benefcio das expresses regulares, mas talvez no seja to bvio como as
expresses regulares podem ser usadas no decorrer do dia para solucionar problemas bem pou-
co interessantes. Eu uso pouco interessante no sentido de que tais problemas, frequentemente,
no esto sujeitos s estrias sobre guerra de um botequim, mas que so bem interessantes devi-
do ao fato de que at serem solucionados, no possvel prosseguir em seu trabalho real.
Como um simples exemplo, eu precisei verificar uma srie de arquivos (na verdade, os 70
arquivos ou mais que compreendem a fonte para este livro) para confirmar se cada arquivo
continha exatamente SetSize [ajustar tamanho] com tanta frequncia (ou to raramente) quan-
to continha ResetSize [reajustar tamanho]. Para complicar as coisas, eu precisava desconside-
rar as letras maisculas (de modo que, por exemplo, setSize seria contado exatamente como
SetSize). Certamente que inspecionar as 32.000 linhas de texto mo no era prtico.
Mesmo usando a busca normal encontrar essa palavra em um editor seria rduo, espe-
cialmente com todos os arquivos e todas as possveis diferenas de maisculas.
Expresses regulares para o resgate! Digitando apenas um nico comando curto, eu fui
Expresses Regulares como uma Linguagem 3

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.

Expresses Regulares como uma Linguagem


A menos que tenha alguma experincia com expresses regulares, voc no entende
a expresso regular ^(From|Subject): do ltimo exemplo, porm, no h nenhuma
mgica nela. De fato, no h nada mgico em mgica. O mgico simplesmente entende
algo simples que no parece ser simples ou natural plateia inexperiente. Quando voc
tiver aprendido como segurar uma carta enquanto faz a sua mo parecer vazia, s ser
necessrio praticar e voc tambm poder fazer mgica. Como um idioma estrangeiro
uma vez aprendido, ele deixa de ser esquisito.

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

A Analogia de Nome de Arquivo


Uma vez que decidiu usar este livro, provavelmente voc tem ao menos alguma ideia do
que uma expresso regular. Ainda que no tenha, quase com certeza j est familiari-
zado com o conceito bsico.
Voc sabe que report.txt um nome de arquivo especfico, mas, se teve qualquer experincia
com Unix ou DOS/Windows, tambm sabe que o padro *.txt pode ser usado para sele-
cionar mltiplos arquivos. Com padres de nome de arquivo como esse (chamado arquivos
globais ou curingas), alguns caracteres tm significado especial. O asterisco significa com-
binar qualquer coisa e um ponto de interrogao significa combinar qualquer caractere.
Assim, com o arquivo global *.txt, comeamos com uma combinao de qualquer coisa

* 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

Conforme veremos em breve, as expresses regulares completas so montadas a partir


s!<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>!<inet>$1</inet>!
de pequenas unidades de bloco de montagem. Cada bloco individual bastante simples,
will soonmas,become
vistocrystal clear
que eles to you,
podem sertoo.
combinados de uma infinidade de maneiras, saber como
combin-los para atingir determinado
This example is from a Perl language script that objetivo
my requer alguma
editor used to experincia.
modify a Assim, este
manuscript. The author had mistakenly used the typesetting tag <emphasis> toregular. Apesar
captulo oferece uma rpida viso geral de alguns conceitos de expresso
de ele no se aprofundar muito, oferece uma base para o restante deste livro se construir
mark Internet IP addresses (which are sets of periods and numbers that look like
e ajusta o cenrio para importantes aspectos laterais que so mais detalhados antes de
209.204.146.22). The incantation uses Perls text-substitution command with the
ly 2006 02:01
nos aprofundarmos nas verdadeiras expresses regulares.
regular expression
Enquanto que alguns exemplos podem parecer tolos (porque alguns so tolos), eles
! <emphasis>([0-9]+(\.[0-9]+){3})</emphasis>"
representam os tipos de tarefas que voc desejar fazer ainda que por enquanto no
to replaceperceba. Se with
such tags cada the
ponto no parecer
appropriate fazer tag,
<inet> sentido,
whileno se preocupe
leaving muito.
other uses of Apenas deixe
a essncia da lio entrar. Esse o objetivo deste captulo.
<emphasis> alone. In later chapters, youll learn all the details of exactly how this
type of incantation is constructed, so youll be able to apply the techniques to
your own needs, with your own application or programming language.

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

Se Voc Tiver Alguma Experincia com Expresso Regular


Se voc j estiver familiarizado com as expresses regulares, muito desta viso geral no
ser nova, mas de qualquer forma, por favor, assegure-se de dar ao menos uma olhada nela.
Mesmo que voc esteja ciente do significado bsico de determinados metacaracteres, talvez
algumas formas de pensar sobre e olhar para as expresses regulares sejam novas.
Assim como h uma diferena entre tocar uma pea musical bem e fazer msica, h uma
diferena entre saber sobre expresses regulares e entend-las, realmente. Algumas das
lies apresentam as mesmas informaes com as quais voc j est familiarizado, mas em
maneiras que podem ser novas e que so os primeiros passos para entender realmente.

Buscando Arquivos de Texto: Egrep


Encontrar texto um dos usos mais simples de expresses regulares muitos editores
de texto e processadores de palavras permitem que voc busque um documento, usando
um padro de expresso regular. Mais simples ainda o utilitrio egrep. D egrep uma
expresso regular e alguns arquivos para buscar e ele tentar combinar a expresso regu-
lar a cada linha de cada arquivo, exibindo apenas aquelas linhas nas quais for encontrada
uma combinao. O utilitrio egrep est disponvel gratuitamente para muitos sistemas,
incluindo DOS, MacOS, Windows, Unix e assim por diante. Veja no web site deste livro,
http://regex.info, links sobre como conseguir uma cpia de egrep para o seu sistema.
Voltando ao exemplo de e-mail da pgina 3, o comando que usei para gerar um sumrio
improvisado do arquivo de e-mail mostrado na Figura 1-1. O egrep interpreta o primeiro
agumento da linha de comando como uma expresso regular e, quaisquer argumentos
restantes como arquivo(s) a buscar. No entanto, observe que as aspas simples mostradas
na Figura 1-1 no fazem parte da expresso regular, mas so solicitadas pelo meu shell de
comando. Ao usar egrep, normalmente eu envolvo a expresso regular com aspas sim-
ples. Exatamente quais caracteres so especiais, em quais contextos, para qual ( expresso
regular ou ferramenta) e em que ordem eles so interpretados, tudo uma questo que
cresce em importncia quando voc vai para o uso de expresso regular em linguagens de
programao totalmente desenvolvidas algo que veremos a partir do prximo captulo.

prompt [indicador] aspas para o envoltrio


de envoltrio
de comando expresso regular passada para egrep

% egrep ^ (De|Assunto): caixa de correspondncia arquivo

argumento de primeira linha de comando

Figura 1-1: Chamando egrep a partir da linha de comando.

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

Em instantes, comearemos a analisar apenas o que significam as diversas partes da re-


gex, mas provavelmente, voc j pode imaginar apenas vendo que alguns dos caracteres
tm significados especiais. Neste caso, os parnteses, os caracteres ^ e | so metacarac-
teres de expresso regular e combinam com os outros caracteres para gerar o resultado
que desejo.
Por outro lado, se a sua expresso regular no usa qualquer um da dzia ou algo assim dos
metacaracteres que egrep entende, efetivamente ela se torna uma busca de texto simples. Por
exemplo, buscar por cat em um arquivo, encontra e exibe todas as linhas com as trs letras, c
a t em uma linha. Por exemplo, isso inclui qualquer linha contendo vacation [frias].
Ainda que a linha possa no ter a palavra cat, a string c-a-t em vacation ainda pode ser combi-
nada. Como ela est l, egrep prossegue e exibe toda a linha. O ponto chave que a expresso
regular de busca no feita em uma base de palavra egrep pode entender o conceito de
bytes e linhas em um arquivo, mas normalmente, ele no tem ideia de palavras do Ingls (ou
de qualquer outro idioma), sentenas, pargrafos ou outros conceitos de alto nvel.

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.

Incio e Fim da Linha


Provavelmente, os metacaracteres mais fceis de entender so ^ (circunflexo) e $ (ci-
fro), que representam, respectivamente, o incio e o fim da linha de texto, como ela est
sendo verificada. Como vimos, a expresso regular cat encontra c-a-t em qualquer lugar
na linha, mas ^cat s combina se o c-a-t estiver no incio da linha efetivamente, o

^ 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

^cat$, ^$ ou mesmo s ^ ? Vire a pgina para verificar as suas interpretaes.


O circunflexo e o cifro so especiais, uma vez que eles combinam uma posio na linha
em vez de qualquer dos caracteres do prprio texto. claro que h diversas maneiras de
8 Captulo 1: Introduo a Expresses Regulares

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

% egrep q[^u] word.list


Iraqi
Iraqian
migra
qasida
qintar
goph
zaqqum%
Duas palavras notveis no relacionadas so Qantas, a empresa area Australiana, e
Iraq [Iraque]. Embora ambas as palavras estejam no arquivo word.list, nenhuma delas
foi exibida pelo meu comando egrep. Por que? Pense um pouco nisso e depois vire a
pgina para conferir o seu raciocnio.
Lembre-se que um caractere de classe de negao significa combinar com um caracte-
re que no est relacionado e no no combinar com o que est relacionado. Esses
podem parecer iguais, mas o exemplo Iraq mostra a diferena sutil. Uma maneira con-
veniente de ver uma classe negada que ela , apenas, uma abreviao de uma classe
normal que inclui todos os possveis caracteres, exceto aqueles que esto relacionados.

Combinando Qualquer Caractere com Dot [Ponto]


O metacaractere . (normalmente chamado de dot ou ponto) uma abreviao de uma
classe de caracteres que combina com qualquer caractere. Ele pode ser conveniente
quando voc quer ter um detentor de lugar do tipo qualquer caractere aqui em sua
expresso. Por exemplo, se quiser buscar por uma data, tal como 19/03/76, 19-03-76
ou mesmo 19.03.76, voc teria que ter o trabalho de montar uma expresso regular que
usasse classes de caracteres para permitir, explicitamente /, - ou . entre cada nme-
ro, tal como 19[-./]03[-./]76. No entanto, tambm seria possvel experimentar apenas

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.

Com 19.03.76 , os pontos so metacaracteres aqueles que combinam com qualquer


caractere (inclusive o trao, o ponto e a barra oblqua que estamos esperando). No
entanto, importante saber que cada ponto pode combinar com qualquer caractere,
portanto, ele pode combinar, digamos, com nmeros de loteria: 19 203319 7639.
Assim, 19[-./]03[-./]76 mais exato, porm, mais difcil de ler e escrever. 19.03.76 fcil
de entender, mas vago. O que deveramos usar? Tudo depende do que voc sabe sobre os
dados sendo buscados e o quo especfico voc sente que precisa ser. Uma questo impor-
tante repetitiva est relacionada com equilibrar o seu conhecimento de texto sendo procu-
rado com a necessidade de ser sempre preciso ao escrever uma expresso. Por exemplo, se
voc soubesse que os seus dados seriam, pouco provavelmente, para 19.03.76 combinar
em um lugar indesejado, com certeza seria razovel us-los. Conhecer bem o texto alvo
uma parte importante em moldar com eficincia as expresses regulares.

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

:. Efetivamente, ela combina:


1) incio de linha, seguido por F-r-o-m, seguido por :
ou 2) incio de linha, seguido por S-u-b-j-e-c-t, seguido por :
ou 3) incio de linha, seguido por D-a-t-e, seguido por :
Colocando menos literalmente, ela combina linhas comeando com From:, Subject:
ou Date:, que bastante til para relacionar as mensagens em um arquivo de e-mail.

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
.
.

Ignorando as Diferenas em Letras Maisculas


Este exemplo de cabealho de e-mail oferece uma boa oportunidade para apresentar
o conceito de uma combinao case-insensitive [ignorando maisculas e minsculas].
Normalmente, o campo de fontes em um cabealho de e-mail aparece com maiscula
frente, tal como Assunto e De, porm, o e-mail padro permite a mistura de letras mai-
sculas e minsculas, de modo que coisas como DATA e de tambm so permitidas.
Infelizmente, a expresso regular na seo anterior no as combina.
Uma abordagem substituir From por [Ff][Rr][Oo][Mm] para combinar qualquer forma
de from, porm, isso no mnimo de manejo bem difcil. Por sorte, h uma maneira de
dizer ao egrep para ignorar o estilo de fonte ao fazer comparaes, ou seja, executar a
combinao de uma maneira sensvel case-insensitive, onde as diferenas de maisculas
ou minsculas so simplesmente ignoradas. Isso no faz parte da linguagem de expresso
regular, mas um recurso til associado que muitas ferramentas fornecem. A opo de
linha de comando de egrep -i o informa para fazer uma combinao sensvel tipogr-
fica. Coloque i na linha de comando antes da expresso regular:
% egrep i ^(From)Subject|Date): mailbox

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.

That dang - tootin #@!%* varmints cost me $199.95 !

- posies onde \< verdadeira - posies onde \> verdadeira palavras


That dang - tootin #@!%* varmint

- posies onde \< verdadeira - posies onde \> ve

Figura 1-2: Posies de incio e fim de palavra

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

Alm da tabela, pontos importantes a serem lembrados incluem:


As regras sobre quais caracteres so metacaracteres e quais no so (e exatamente o que eles
significam) diferem dentro de uma classe de caracteres. Por exemplo, ponto um metaca-
Metacaracteres Egrep 15

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

claro que poderamos simplesmente usar ( July|Jul)(fourth|4th|4), mas, vamos ex-


plorar outras formas de expressar a mesma coisa.
Primeiro, podemos encurtar o ( July|Jul) para ( July?). Voc v como eles so, efetiva-
mente, iguais? A remoo do | significa que os parnteses no so mesmo mais neces-
srios. Afastar os parnteses no incomoda, mas com eles removidos, July? um pouco
menos amontoado. Isso nos deixa com July?(fourth|4th|4).
Indo para a segunda metade, podemos simplificar o 4th|4 para 4(th)?. Como possvel
ver, ? pode anexar a uma expresso com parnteses. Dentro dos parnteses pode haver
uma subexpresso to complexa quanto voc quiser, mas de fora ela considerada
uma unidade individual. O agrupamento para ? (e outros metacaracteres similares que
apresentaremos em breve) um dos principais usos de parnteses.
Agora, a nossa expresso se parece com July?(fourth|4(th)?). Ainda que haja uma boa
quantidade de metacaracteres e at mesmo parnteses aninhados, no to difcil deci-
frar e entender. Essa abordagem de dois exemplos essencialmente simples foi bastante
longa, mas ao mesmo tempo, cobrimos tpicos importantes, que acrescentam muito, tal-
vez apenas no subconsciente, ao nosso entendimento de expresses regulares. Da mesma
forma, obtemos alguma experincia em tomar diferentes caminhos na direo do mesmo
objetivo. medida em que avanamos por este livro (e atravs de um entendimento
melhor), voc descobrir muitas oportunidades para resultados criativos para prosseguir
enquanto estiver tentando encontrar a maneira tima de solucionar um problema com-
plexo. Longe de ser uma cincia retrograda, escrever expresses regulares est mais perto
de uma arte.

Outros Quantificadores: Repetio


Semelhantes interrogao, so + (adio) e * (um asterisco, mas como um metacarac-
tere de expresso regular, eu prefiro o termo estrela). O metacaractere + significa um
ou mais do item imediatamente precedente, e * significa qualquer nmero do item,
inclusive nenhum. Escrito diferentemente, ...* significa tentar combin-lo tantas vezes
quantas possvel, mas est certo ajustar para nenhuma, se for preciso. A construo com
o sinal de adio, ...+ semelhante no que se refere a que ele tambm tenta combinar
tantas vezes quanto possvel, porm diferente, pois falha se no puder combinar pelo
menos uma vez. Esses trs metacaracteres, ponto de interrogao, adio e estrela so
chamados de quantificadores, porque eles influenciam a quantidade do que regem.
Tal como ...?, a parte ...* de uma expresso sempre bem sucedida, sendo que a nica
questo qual texto (se houver) combinado. Compare isso com ...+, que falha, a me-
nos que o item combine pelo menos uma vez.
Por exemplo, ? permite um nico espao opcional, mas * permite qualquer quan-
tidade de espaos opcionais. Podemos usar isto para tornar mais flexvel o exemplo da
pgina 8 <H[1-6]>. A especificao HTML diz que so permitidos espaos imediatamente
antes do fechamento >, tal como com <H3> e <H4>. Inserindo * em nossa ex-
presso regular onde queremos permitir (mas no exigir) espaos, obtemos <H[1-6]*>.
Isso ainda combinar <H1>, pois no so exigidos quaisquer espaos, porm, ainda
flexvel para se relacionar com as outras verses.
Aprofundando-nos mais, busquemos uma tag HTML, tal como <HRSIZE=14>, a qual indi-
ca que uma linha (uma Horizontal Rule [Linha Horizontal]) com 14 pixels de espessura deve
Metacaracteres Egrep 17

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

Formando uma Subexpresso tima


Resposta pergunta da pgina 17.
Neste caso, opcional significa que ele permitido uma vez, porm, no exigido. Isso
significa usar ?. Visto que o item opcional maior que um caractere, precisamos usar
parnteses: (...) ?. Inserindo em nossa expresso, obtemos:
!<HR( +SIZE += +[0-9]+)? +>"

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.

Tabela 1-2: Resumo de Quantificador Repetio de Metacaracteres

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)

Faixa definida de combinaes: intervalos


Algumas verses de egrep suportam uma meta string para oferecer o seu prprio mnimo
e mximo: ...{min, max}. Isso chamado de quantificador de intervalo. Por exemplo, ...{3,
12} combina at 12 vezes, se possvel, mas, para em trs. Seria possvel usar [a-zA-Z] {1. 5}
para combinar um registrador automtico de cotao de ttulos dos EUA ( uma de cinco
letras). Usar essa notao, {0,1}, o mesmo que usar um ponto de interrogao.
No so muitas as verses de egrep que j suportam essa notao, porm, muitas ferra-
mentas o fazem, assim, ela discutida no Captulo 3, quando virmos em detalhes o amplo
espectro de metacaracteres comumente utilizados na atualidade.

Parnteses e Referncias Anteriores


At agora, vimos duas utilizaes para os parnteses: limitar o escopo de alternncia, |
e agrupar mltiplos caracteres em unidades maiores s quais possvel aplicar quantifica-
dores, como pontos de interrogao e estrela. Eu gostaria de discutir sobre um outro uso
especializado que no comum em egrep (embora a verso popular do GNU suporte),
mas que normalmente encontrado em muitas outras ferramentas.
Em muitos sabores de expresses regulares, os parnteses podem se lembrar de texto
combinado pela subexpresso que eles envolvem. Usaremos isso em uma soluo parcial
para o problema de palavras duplicadas do incio deste captulo. Se voc conhecesse a a
palavra (the word do livro original para explicar a prxima sentena) duplicada especfica
a encontrar (tal como o the nesta sentena conseguiria peg-la?), poderia busc-la expli-
citamente, tal como com thethe. Nesse caso, tambm poderia encontrar itens tais como
thetheory, embora pudesse contornar o problema facilmente se o seu egrep suportasse as
Metacaracteres Egrep 19

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

O Objetivo de uma Expresso Regular


A partir da ampla viso de cima para baixo, uma expresso regular ou combina dentro
de um pedao de texto (com egrep, cada linha), ou no combina. Ao moldar uma ex-
presso regular, preciso levar em conta o cabo-de-guerra em andamento entre fazer a
sua expresso combinar com as linhas desejadas, e mesmo assim, no combinar com as
linhas que voc no deseja.
Da mesma forma, enquanto que egrep no se preocupa onde, na linha, acontece uma
combinao, essa preocupao importante para muitas outras utilizaes de expresso
regular. Se o seu texto for algo como
...CEP 44272. Se voc escrever, envie $4,85 para o valor do selo...
e voc s quiser encontrar as linhas que combinam com [0-9]+, no tem preocupao
com quais nmeros so combinados. No entanto, se a sua inteno for fazer alguma
coisa com o nmero (tal como salvar um arquivo, acrescentar, substituir e etc. veremos
exemplos desse tipo de processamento no prximo captulo), voc se preocupar muito,
exatamente para com quais nmeros so combinados.

Mais Alguns Exemplos


Como com qualquer linguagem, a experincia uma coisa muito boa, assim, incluo mais al-
guns exemplos de expresses regulares para combinar com algumas construes comuns.
Ao escrever expresses regulares, metade da batalha conseguir combinaes bem suce-
didas quando e onde voc as deseja. A outra metade no combinar quando e onde voc
no deseja. Na prtica, ambas so importantes, entretanto no momento, eu gostaria de me
concentrar na questo conseguir combinaes bem sucedidas. Ainda que os exemplos
no sejam tomados em sua maior profundidade, eles ainda oferecem uma perspiccia til.
Nomes de Variveis
Muitas linguagens de programao tm identificadores (nomes de variveis, etc.) que s po-
dem conter caracteres alfanumricos e sublinhados, porm, que no podem comear com
um dgito. Eles so combinados por [a-zA-Z_][a-zA-Z_0-9]*. A primeira classe de caractere
combina com o que o primeiro caractere pode ser, a segunda (seguida por uma estrela),
possibilita o restante do identificador. Se houver um limite no comprimento de um iden-
tificador, digamos de 32 caracteres, voc pode substituir a estrela por {0,31} se a notao

{min,max} for suportada. (Essa construo, o quantificador de intervalo, foi mencionada


rapidamente na pgina 18.)
Uma string dentro de aspas duplas
Uma soluo simples para combinar uma string [string] dentro de aspas duplas poderia
ser: [^]*.
As aspas duplas em cada extremidade devem combinar com as aspas duplas de abertura e fe-
chamento da string. Entre elas, podemos no ter nada ... exceto uma outra aspa dupla! Assim,
usamos [^*] para combinar todas os caracteres, exceto uma aspa dupla, e aplicar usando uma
estrela para indicar que temos qualquer quantidade de tais caracteres no de aspas duplas.
Uma definio mais til (ainda que mais complexa) de uma string entre aspas duplas, permite
22 Captulo 1: Introduo a Expresses Regulares

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

Nomenclatura de Expresso Regular


Regex
Como voc deve ter imaginado, usar a frase completa expresso regular pode ficar um
pouco cansativo, especialmente escrevendo. Em vez disso, geralmente eu uso regex.
Isso sai direto da lngua (e rima com FedEX, com um som duro de g, como regular e
no um suave, como em Regina) e receptivo a uma srie de usos, como quando voc
regex ..., principiantes em regex e at mesmo regexificao. Eu uso a frase motor
de regex para fazer referncia parte de um programa que, de fato, faz o trabalho de
executar uma tentativa de combinao.

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

28 Chapter 1: Introduction to Regular Expressions

Ampliando a Regex de Tempo para Lidar com


Extending the Time
24Regex
Horas to
noHandle
Relgio a 24-Hour Clock
Resposta
Answertopergunta
the question on page
da pgina 23.26.
There ar
Existem e various
diversas solutions,
solues, mas,but we can
como usepodemos
antes, similar logic as before.
usar lgica This time,
semelhante. Desta
Ill separaremos
vez, break the task into three
a tarefa groups:
em trs oneum
grupos: forpara
the morning
a manh (hours 00 athr
(horas 00 ough
09, com o
09, na
zero with thesendo
frente leading zero being
opcional), optional),
um para onediurno
o horrio for the daytime
(horas 10 a (hours
19) e um 10para
a thr ough
noite 19),20
(horas and oneIsso
a 23). for pode
the evening (hours 20
ser apresentado de thr
uma ough 23).
forma This
bem can be
direta: 0?[0-9]
| render in a .pretty straightforward way: ! 0?[0-9]<1[0-9]<2[0-3]".
1[0-9] |ed2[0-3]

NaActually,
verdade,we can combine
possvel combinartheas rst
duastwo alternatives,
alternativas, resulting
resultando in the
no mais shorter
curto [01]?[0-9]
| ![2[0-3] . Voc precisaria
01]?[0-9]<2[0-3]"

pensar
. You um pouco
might need to nisso paraabout
think se convencer
it a bit se
to elas, realmen-
convince
te,yourself
combinaro exatamente
that theyll reallyomatch
mesmoexactly
texto, the
massame
elas otext,
fazem.
butAthey
figura
do.a The
seguirg-pode
ajudar e tambm
ure below mightexibe
help,umaandoutra abordagem.
it shows anotherOs grupos sombreados
approach as well. Therepresentam
shaded
nmeros
groups que podemnumbers
represent ser combinados
that can por uma nica
be matched byalternativa.
a single alternative.

[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.

Melhorando no Status Quo


Ao se aprofundar nelas, as expresses regulares no so difceis. Porm, se voc conversar
com o usurio mediano de um programa ou linguagem que as suporta, provavelmente,

2 July 2006 02:01 2 July 2006 02:01


O livro definitivo sobre codificaes de mltiplos bytes CJKV Information Processing de Ken Lunde, tambm pu-
blicado pela OReilly. O CJKV significa Chins, Japons, Coreano e Vietnamita, os idiomas que costumam exigir codi-
ficaes de mltiplos bytes. Gentilmente, Ken e a Adobe forneceram muitas das fontes especiais usadas neste livro.
Ampliando a Base 27

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

muito importante. Na verdade, motores de expresso regular podem ser implementa-


dos de maneiras diferentes, assim, s vezes, diferentes programas fazem coisas diversas
com a mesma expresso. Examinamos esse rico assunto nos Captulo 4, 5 e 6.
O ltimo ponto o mais importante e o mais difcil de encaminhar. Infelizmente, a discus-
so s vezes um pouco seca, com o leitor se atrapalhando um pouco at chegar parte
divertida atacando problemas reais. No entanto, entender como realmente trabalha o
motor de regex importante para entender realmente.
Voc poderia argumentar que no quer aprender como um carro trabalha quando apenas
deseja saber como dirigir. Mas, saber dirigir um carro uma pobre analogia para aprender
sobre as expresses regulares. O meu objetivo ensin-lo como solucionar problemas
com as expresses regulares, e o que significa construir expresses regulares. A melhor
analogia no como dirigir um carro, mas como montar um. Antes de voc poder montar
um carro, precisa saber como ele trabalha.
O Captulo 2 oferece mais experincia de direo. O Captulo 3 d uma rpida olhada
na histria de direo e uma olhada detalhada no trabalho corporal do sabor de uma
expresso. O Captulo 4 observa toda a importncia do motor de um sabor de regex. O
Captulo 5 mostra alguns exemplos ampliados, o Captulo 6 mostra a voc como sintoni-
zar determinados tipos de motores, e os captulos posteriores examinam algumas marcas
e modelos especficos. Especialmente nos Captulo 4, 5 e 6, gastaremos muito tempo em
segundo plano, portanto, assegure-se de ter o seu macaco e trapos de oficina mo.

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

Alm disso, assegure-se de entender os seguintes pontos:


Nem todos os programas de egrep so iguais. Os metacaracteres suportados, assim
como seus significados exatos, frequentemente so diferentes veja a sua documen-
tao local ( 20).
Trs motivos para usar os parnteses so a alternncia restritiva ( 11), o agrupamento
( 14) e a captura ( 19).
As classes de caracteres so especiais e tm seu prprio conjunto de metacaracteres,
totalmente separados da linguagem principal de regex ( 10).
A alternncia e as classes de caracteres so fundamentalmente diferentes, fornecendo servi-
os no associados que parecem se sobrepor, apenas em uma situao limitada ( 11).
Uma classe de caractere de negao ainda uma assero positiva mesmo negada,
uma classe de caractere precisa combinar com um caractere para ser bem sucedida.
Pelo fato da listagem de caracteres a combinar ser de negados, o caractere combinado
deve ser um daqueles no relacionados na classe ( 09).
A til opo i desconsidera as letras maisculas durante uma combinao ( 11).
Existem trs tipos de itens escapados:
1. A combinao de \ e um metacaractere uma meta string para combinar com o
caractere literal (por exemplo, \* combina com um asterisco literal).
2. A combinao de \ e no metacaracteres selecionados torna-se uma meta string
com um significado definido por implementao (por exemplo, \< frequentemente
significa incio de palavra).
3. A combinao de \ e qualquer outro caractere padroniza simplesmente para com-
binar o caractere (isto , a barra invertida ignorada).
Porm, lembre-se de que uma barra invertida dentro de uma classe de caractere no
especial em quase a totalidade das verses de egrep, assim, ela no oferece servios
de escape em tal situao.
Itens controlados por um ponto de interrogao ou por uma estrela, na verdade, no
precisam combinar quaisquer caracteres para combinar com sucesso. Eles so sem-
pre bem sucedidos, mesmo se no combinarem com nada ( 15).
30 Captulo 1: Introduo a Expresses Regulares

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.

You might also like