Tabela de conteúdos
Expressões regulares
Expressões regulares são descrições formais para padrões de caracteres. Mas afinal, o que isso significa?
Uma descrição formal é uma descrição que deve seguir regras específicas para ser compreendida, isto é, não é como um texto livre, no qual se pode fazer a mesma descrição de várias formas diferentes, tendo todas elas o mesmo significado. Não, na descrição formal, não há muito espaço para variações, existe modos bem específicos de se descrever algo.
E que algo é esse? No caso das expressões regulares, esse algo são caracteres. Ou seja, dentro de um conjunto arbitrário de caracteres, podem existir determinados padrões, mais especificamente, combinações de caracteres que estão conforme um padrão.
Existe uma sintaxe a ser usada para formular expressões, e nesse sentido podemos dizer que expressões regulares são uma linguagem específica de domínio . Porém não há apenas uma sintaxe: existem diferentes especificações, e diferentes implementações de interpretadores de expressão regular.
Aplicabilidade
Falei sobre o que são expressões regulares, mas talvez não tenha explicado muito bem para que servem. Ocorre que podemos observar padrões de caracteres em diversas situações.
Para entender melhor o que são padrões, imagine por exemplo a definição de um nome próprio. Ele começa com uma letra maiúscula, seguida de uma ou mais letras minúsculas. Um CPF é um outro padrão, composto de 11 números, dos quais os 9 primeiros são agrupados de 3 em 3, separados por pontos, e os últimos dois são dígitos verificadores, separados dos demais por um hífen.
Se quiser pesquisar por um nome ou CPF específico em um texto, é fácil, basta procurar por uma ocorrência dele. Mas se quiser procurar qualquer nome próprio ou qualquer CPF, você precisa expressar essa pesquisa como um padrão a ser procurado. É aí que expressões regulares são úteis. Elas proveem uma sintaxe para definir o padrão de pesquisa.
Sintaxe
Para escrever expressões regulares, você precisa compreender a sintaxe dessas expressões. Existem diversos símbolos e combinações desses símbolos, cada qual com seu significado. A sintaxe varia um pouco, em alguns aspectos, a depender do padrão utilizado, mas também possui muitos aspectos comuns a todos eles.
Algumas expressões são extremamente simples, outras são praticamente ilegíveis de tão complexas. Tudo depende de quão precisa você quer que seja a expressão, e das situações em que pretende aplicar a expressão.
Nas subseções a seguir você verá os principais elementos que precisa saber sobre essa sintaxe.
Literais
…
Caracteres reservados
…
Classes
…
Classes pré-definidas
…
Quantificadores
…
Âncoras
…
Alternativas
…
Grupos
…
Capturas e referências
…
História
…
Padronização
Expressões regulares são padronizadas? Sim e não. Explico. Ocorre que existe mais de um padrão, o que na prática pode ser entendido como ausência de padrão. Alguns padrões são mais conhecidos e utilizados, e outros menos.
Um dos padrões mais conhecidos é o POSIX, que prevê duas formas de expressão regular: básicas (Basic Regular Expressions, ou BRE) e estendidas (Extended Regular Expressions, ou ERE). Ambas são descritas nas seguintes revisões:
Outro padrão conhecido é o utilizado em Perl:
Cabe destacar que o padrão Perl não é usado apenas na linguagem Perl. Ele foi adaptado posteriormente para outras bibliotecas e ambientes de execução.
Ainda outro padrão é o I-Regexp (RFC 9485), que possui um escopo enxuto e o foco em interoperabilidade entre as bibliotecas (e até com outros padrões).
Por fim, temos também a especificação do ECMAScript (ECMA 262), que é aplicável a implementações da linguagem Javascript.
Além dos padrões que detalham a interpretação de expressões, de modo geral, existe ainda o padrão Unicode Regular Expressions (UTS#18), que trata sobre a adequação de motores de expressão regular ao padrão Unicode.
Implementações
Cada implementação pode adotar um padrão diferente para a interpretação de expressões regulares (ou não adotar nenhum, aliás).
E essas implementações podem tanto residir em algum ambiente de desenvolvimento (isto é, para uso interno na codificação dos programas), como em programas que precisam realizar processamento de expressões regulares (o que ocorre em servidores Web, indexadores de conteúdo, servidores de e-mail, editores de texto e vários outros tipos de programa).
Para o padrão POSIX, as implementações estão presentes nas bibliotecas que implementam o POSIX. Como a biblioteca POSIX é uma extensão da biblioteca C, então é comum que observar implementações conjuntas dos dois padrões (por exemplo, glibc e musl-libc são ao mesmo tempo bibliotecas C e bibliotecas POSIX).
Existem também implementações avulsas do motor de expressões regulares do POSIX. Por exemplo, a biblioteca TRE implementa expressões regulares aderentes ao POSIX, porém não outras partes do POSIX e nada da biblioteca C.
O padrão de expressões regulares do POSIX, obviamente é o padrão utilizado em programas especificados no padrão POSIX.
Já o padrão de Perl (também obviamente) é usado em Perl (e por tabela em vários de seus módulos), mas acabou por se tornar influente, e posteriormente foi reimplementado na biblioteca PCRE. Esta por sua vez é utilizada em PHP para realizar o processamento de expressões regulares. Também é usada no servidor Apache, no escaneador de portas Nmap, dentre vários outros programas.
As implementações presentes em Python (módulo re) e Java (classe Pattern) também se descrevem como inspiradas em Perl, porém ambas com suas próprias particularidades.
Outro exemplo interessante é o da biblioteca Boost (C++), cujo módulo de expressões regulares, BoostRegex, prevê o uso de dois padrões: POSIX (tanto a variante básica como a estendida) e Perl (que é utilizada por padrão).
Ainda outro caso curioso é o da biblioteca Gnulib, que possibilita a escolha entre alguns padrões pré-definidos (incluindo as variantes POSIX), mas também uma combinação arbitrária de elementos da sintaxe.
E esta não é uma lista exaustiva (como dificilmente poderia ser). Você pode querer conferir a tabela comparativa na Wikipedia (em inglês).
Outros materiais
Outras páginas e portais dedicados ao assunto de expressões regulares.
- Regular Expression Tutorial (em inglês)
- Perl regular expressions tutorial (em inglês)