Expressões regulares para iniciantes: uma introdução prática
Expressões regulares — "regex" — parecem que alguém adormeceu no teclado: ^\d{3}-\d{4}$. Mas por trás dos símbolos enigmáticos está uma das ferramentas mais poderosas da programação: uma pequena linguagem para descrever e combinar padrões em texto. Aprenda o básico e você economizará horas em tarefas como validação, pesquisa e localização e substituição.
Para que serve a regex
Uma expressão regular descreve um padrão, e um mecanismo regex encontra (ou valida, ou substitui) o texto que corresponde a ele. “Encontrar todos os endereços de e-mail”, “verificar se este é um número de telefone válido”, “substituir cada espaço duplo por um” – todos são trabalhos regex. É compatível com praticamente todas as linguagens de programação e na maioria dos editores de texto.
Os blocos de construção
.— corresponde a qualquer caractere único.\d— qualquer dígito;\w— qualquer caractere de palavra;\s— qualquer espaço em branco.*— zero ou mais;+— um ou mais;?— opcional.{3}— exatamente três;{2,5}— entre dois e cinco.^e$— início e fim da string.[abc]— qualquer um de a, b ou c;[a-z]— qualquer letra minúscula.
Lendo um exemplo real
Pegue ^\d{3}-\d{4}$. Peça por peça: início da string, exatamente três dígitos, um hífen, exatamente quatro dígitos, fim da string. Portanto, corresponde a "123-4567", mas não a "12-4567". De repente, é legível, não mágico.
Teste antes de confiar
A regra de ouro do regex: nunca use um padrão que você não tenha testado em exemplos reais — é fácil estar sutilmente errado (corresponder muito ou pouco). Crie e teste padrões com destaque ao vivo em nosso testador de regex, testando strings que deveriam corresponder e strings que não deveriam.
Onde ir mais fundo
Depois que o básico for usado, conceitos como grupos, alternância e previsões expandem o que você pode fazer. O guia de regex MDN é uma referência excelente e rica em exemplos para as próximas etapas.
Grupos de captura: extração, não apenas correspondência
Parênteses em uma regex têm função dupla — eles agrupam partes de um padrão e "capturam" o que elas correspondem para que você possa extraí-lo. Um padrão como (\d{4})-(\d{2})-(\d{2}) em relação a uma data não apenas confirma o formato; ele entrega o ano, o mês e o dia separadamente. Os grupos de captura transformam o regex de um validador sim/não em uma ferramenta para extrair dados estruturados de textos confusos, um de seus usos diários mais poderosos.
A armadilha da correspondência gananciosa
Por padrão, quantificadores como * e + são "gananciosos" — eles capturam o máximo possível. Portanto, <.+> em relação a corresponde à string inteira, não apenas à primeira tag, porque ela captura tudo até o último >. Adicionar ? torna um quantificador "preguiçoso" (<.+?>), correspondendo o mínimo possível. Essa distinção entre ganancioso e preguiçoso está por trás de uma grande parcela de perguntas do tipo "meu regex corresponde demais".
Saiba quando NÃO usar regex
Regex é poderoso, mas nem sempre é a ferramenta certa. A análise de HTML ou JSON com regex é notoriamente frágil – em vez disso, use um analisador real. E um regex excessivamente inteligente pode ser ilegível e lento (alguns padrões até causam um retrocesso catastrófico que trava seu aplicativo). A regra prática: regex brilha para padrões bem definidos em texto simples; para formatos estruturados, procure um analisador dedicado. Sempre teste seu padrão em relação a dados reais antes de confiar neles.
Resultado
Regex é uma linguagem compacta para combinar padrões de texto — inestimável para validação, pesquisa e substituição, uma vez que você conhece os blocos de construção. Aprenda os símbolos comuns, leia os padrões da esquerda para a direita e sempre teste com dados reais. Muitas vezes compensa a pequena curva de aprendizado.