Publicado em · 10 min de leitura
Regex para Não Desenvolvedores: Um Guia Prático
Um tutorial de regex amigável e leve em jargão, para escritores, analistas, profissionais de marketing e qualquer pessoa que vive no Localizar e Substituir. Aprenda a sintaxe que importa e leve dez receitas prontas para usar.
Por que um não desenvolvedor deveria se importar com regex
Se você já abriu a caixa de Localizar e Substituir no Word, no Google Docs, no Notion, em uma planilha ou no seu editor de texto favorito e pensou "tem que existir um jeito mais rápido de fazer isso", você é exatamente o leitor certo para este guia. Regex, abreviação de regular expression (expressão regular), é uma pequena linguagem de padrões que transforma o Localizar e Substituir de um instrumento bruto em um bisturi. Em vez de procurar por uma única palavra fixa, você descreve a forma do que está procurando: "qualquer número de telefone", "toda linha que começa com uma data", "todos os endereços de e-mail nesta exportação bagunçada".
Regex tem fama de ser intimidador, principalmente porque tutoriais escritos para programadores jogam vinte símbolos em você no primeiro parágrafo. A verdade é que você pode ser extremamente produtivo com cerca de dez caracteres e um punhado de padrões. Este artigo te leva por esse núcleo, depois te entrega dez receitas para copiar e colar que você pode largar na caixa de Localizar e Substituir de quase qualquer aplicativo moderno hoje.
Nota rápida sobre onde regex funciona: é suportado no Microsoft Word (com "Usar curingas" ou via a busca regex mais nova), no Google Docs ("Pesquisar usando expressões regulares"), no Notion (limitado), no VS Code, no Sublime Text, no BBEdit, no Obsidian, no Google Sheets via REGEXMATCH e REGEXREPLACE, no Excel via Power Query e as novas funções REGEX, e em praticamente qualquer editor de código e ferramenta de teste online. Alguns aplicativos usam dialetos ligeiramente diferentes, mas noventa por cento do que você aprende aqui funciona em todo lugar.
O que exatamente é uma regex?
Uma expressão regular é um padrão. Você entrega o padrão a um motor de busca e ele retorna cada pedaço de texto que combina com esse padrão. A regex mais simples possível é uma palavra literal. O padrão cat encontra as letras c, a, t nessa ordem. Até aqui, tudo chato, é apenas Localizar e Substituir comum.
A mágica começa quando você mistura caracteres especiais chamados metacaracteres. Eles não combinam consigo mesmos; descrevem categorias ou regras. Um ponto, por exemplo, significa "qualquer caractere único". O padrão c.t agora combina com cat, cot, cut, c5t e até c#t. De repente um padrão faz o trabalho de dezenas de buscas.
Esse é o modelo mental inteiro. Uma regex é uma string literal de texto onde alguns caracteres são promovidos para significar algo mais geral. Aprenda o que esses caracteres promovidos fazem e você pode ler e escrever quase qualquer padrão que encontrar.
Os blocos de construção que vale a pena memorizar
- . (ponto) combina com qualquer caractere único exceto uma quebra de linha.
- * significa "zero ou mais do anterior". Então a* combina com string vazia, a, aa, aaa e assim por diante.
- + significa "um ou mais do anterior". a+ combina com a, aa, aaa, mas não com string vazia.
- ? significa "zero ou um", ou seja, opcional. colou?r combina tanto com color quanto com colour.
- ^ ancora o padrão ao início de uma linha. ^Hello encontra Hello apenas quando começa uma linha.
- $ ancora ao final de uma linha. \.$ encontra toda linha que termina com um ponto.
- [abc] é uma classe de caracteres. Combina com um caractere que é a, b ou c. [a-z] combina com qualquer letra minúscula, [0-9] qualquer dígito, [A-Za-z0-9] qualquer letra ou dígito.
- [^abc] com um circunflexo dentro dos colchetes significa "qualquer caractere exceto a, b ou c".
- \d é abreviação para qualquer dígito, \w para qualquer caractere de palavra (letras, dígitos, sublinhado), \s para qualquer espaço em branco (espaço, tab, quebra de linha). Suas contrapartes maiúsculas \D, \W, \S significam o oposto.
- Parênteses ( ) criam um grupo, tanto para aplicar quantificadores a vários caracteres de uma vez quanto para capturar texto que você quer reusar em uma substituição.
- O pipe | significa OU. cat|dog combina com cat ou dog.
- Uma barra invertida \ escapa um caractere especial para que combine literalmente. Para encontrar um ponto real, escreva \. Para encontrar um parêntese literal, escreva \(.
Âncoras, quantificadores e a armadilha gulosa
Âncoras (^ e $) são o segredo para escrever padrões precisos. Sem elas, sua regex flutua em qualquer lugar do texto e tende a combinar mais do que você queria. Com elas, você prende o padrão ao início ou fim de uma linha, que é normalmente exatamente o que você quer dizer quando fala "toda linha que começa com um número".
Quantificadores (*, +, ? e a forma de chaves como {2,4}) controlam quantas vezes a coisa anterior se repete. O que você precisa saber é que eles são gulosos por padrão: eles agarram o máximo que podem. Se você escreve <.+> e roda no texto <b>oi</b>, pode esperar que ele combine com <b> e </b> separadamente. Na verdade vai combinar com o <b>oi</b> inteiro de uma vez porque + é guloso. Adicione um ponto de interrogação, <.+?>, e o quantificador se torna preguiçoso, combinando o mínimo possível. Esse único truque economiza uma quantidade enorme de tempo de depuração.
Grupos e backreferences para localizar e substituir
Parênteses servem dupla função. Primeiro, eles te deixam quantificar um pedaço: (ab)+ combina com ab, abab, ababab. Segundo, e muito mais útil, eles capturam o que combinar em um slot numerado ao qual você pode se referir no campo de substituição. O primeiro conjunto de parênteses se torna $1 na maioria dos editores (ou \1 em alguns), o segundo se torna $2, e assim por diante.
É assim que você reordena texto. Suponha que sua planilha tenha nomes escritos como Sobrenome, Nome e você queira Nome Sobrenome. Procure por ([A-Za-z]+), ([A-Za-z]+) e substitua por $2 $1. Pronto, em uma única tacada, em milhares de linhas. Quase toda receita mais à frente neste artigo usa o mesmo truque, então vale a pena se acostumar com a ideia: parênteses à esquerda, números-cifrão à direita.
Receita 1: extrair todo endereço de e-mail de texto bagunçado
Endereços de e-mail são onipresentes em exportações, blocos de assinatura e dumps de CRM. Esse padrão é um padrão sensato. Ele não é perfeito do ponto de vista do RFC (nenhuma regex realmente é), mas captura todo endereço realista em documentos normais.
[\w.+-]+@[\w-]+\.[\w.-]+Receita 2: encontrar números de telefone em qualquer formato comum
Números de telefone são um exemplo maravilhoso de como regex doma entrada bagunçada. O padrão abaixo captura números escritos como 555-123-4567, (555) 123 4567, +1 555.123.4567 e a maioria das variantes intermediárias. Ajuste o + inicial e o código do país se você só precisa de números locais.
\+?\d{1,3}?[\s.-]?\(?\d{2,4}\)?[\s.-]?\d{3,4}[\s.-]?\d{3,4}Receita 3: mudar formato de data de YYYY-MM-DD para DD/MM/YYYY
Este é o movimento clássico de grupos e backreferences. Capture cada parte da data, depois reordene no campo de substituição. Na caixa Localizar cole o padrão abaixo; na caixa Substituir cole $3/$2/$1.
(\d{4})-(\d{2})-(\d{2})Receita 4: remover todas as linhas em branco de um documento
Texto longo colado frequentemente vem com linhas vazias extras que dobram ou triplicam a contagem de páginas. O padrão abaixo combina com uma linha que contém nada além de espaço em branco opcional e uma quebra de linha. Substitua por nada (deixe a caixa Substituir vazia) e seu documento colapsa para linhas com espaçamento simples.
^\s*\nReceita 5: colapsar espaços duplos, triplos ou descontrolados em um
Exportações de OCR, PDFs copiados e documentos antigos do Word são notórios por espalhar espaços duplos entre palavras. Encontre dois ou mais espaços consecutivos e substitua por um único espaço.
{2,}Receita 6: extrair toda URL de um bloco de texto
Precisa pegar todo link de um artigo, exportação de e-mail ou log de chat? Esse padrão captura URLs http e https, incluindo paths e query strings. Combine com o recurso "copiar todas as correspondências" do seu editor, ou cole as correspondências capturadas em um documento novo.
https?://[\w.-]+(?:/[\w./?=&%#-]*)?Receita 7: capitalizar a primeira letra de todo nome em uma lista
Se você tem uma coluna cheia de nomes digitados em minúsculo (jane doe, mark twain) você pode corrigir a capitalização em duas passagens. Primeiro, encontre o padrão abaixo e capture a primeira letra de cada palavra. A maioria dos editores então te deixa substituir por \u$1 (maiúscula da primeira captura). Se o seu não deixa, passe a lista por um conversor de capitalização dedicado e traga de volta. O Multilities oferece um pequeno conversor de capitalização que faz isso em um clique.
\b([a-z])Receita 8: manter apenas linhas que contêm um número
Alguns editores te deixam deletar toda linha que não combina com uma regex. Combinado com o padrão abaixo, você pode reduzir um arquivo de log longo ou um documento de notas até apenas as linhas contendo um número, o que é maravilhoso para limpar extratos bancários colados de um PDF.
^.*\d+.*$Receita 9: padronizar espaço em branco no final de toda linha
Espaços ao final são invisíveis mas quebram ferramentas de diff, assinaturas de e-mail e comentários de código. Encontre-os e substitua por nada. O padrão combina com um ou mais espaços ou tabs que ficam imediatamente antes do final de uma linha.
[ \t]+$Receita 10: extrair hashtags de uma exportação de mídias sociais
Equipes de marketing exportam tweets, posts do LinkedIn e legendas do Instagram e querem contar quais hashtags apareceram. O padrão abaixo encontra um # imediatamente seguido de um ou mais caracteres de palavra, o que captura toda hashtag realista sem arrastar a pontuação ao redor.
#\w+Como realmente experimentar isso na sua ferramenta
No Google Docs, abra Editar, depois Localizar e substituir, e marque "Pesquisar usando expressões regulares". No Microsoft Word, abra a caixa Localizar e Substituir, expanda-a e marque "Usar curingas" (o dialeto de curingas do Word é similar mas não idêntico, então os padrões acima podem precisar de ajuste lá). No Notion, regex é suportado em algumas propriedades de banco de dados e via integrações, mas a barra de busca em si é literal.
No Google Sheets, envolva o padrão em REGEXMATCH, REGEXEXTRACT ou REGEXREPLACE: =REGEXEXTRACT(A2, "[\w.+-]+@[\w-]+\.[\w.-]+") puxa o e-mail da célula A2. As novas funções REGEXEXTRACT, REGEXREPLACE e REGEXTEST do Excel se comportam de forma similar. No VS Code, Sublime e na maioria dos editores de código, clique no ícone .* na barra de busca para mudar a busca para o modo regex.
Quando um padrão se comporta mal, não fique olhando para ele. Coloque-o em um testador de regex que destaca correspondências enquanto você digita. O Multilities oferece um /tools/regex-tester gratuito exatamente para isso, e uma ferramenta /tools/find-replace que roda seus padrões sobre um bloco de texto colado sem tocar no documento original. Iterar em um testador leva segundos; iterar dentro do Word com Desfazer leva minutos.
Erros comuns e como evitá-los
- Esquecer de escapar o ponto. Se você quer um período literal (em um nome de domínio, extensão de arquivo ou frase), escreva \. O ponto cru combina com qualquer coisa.
- Usar .* quando você quer dizer \S+ ou [^,]+. O padrão ponto-estrela é guloso e frequentemente come mais do que você queria, especialmente através de vírgulas, aspas ou tags HTML.
- Ancorar com ^ e $ mas esquecer que ^ e $ funcionam por linha em algumas ferramentas e por documento em outras. Se você obtiver correspondências inesperadas, verifique se seu editor tem um toggle "multilinha" ou "dotall".
- Misturar dialetos. JavaScript, Python, PCRE, curingas do Word e regex POSIX compartilham a maior parte da sintaxe mas divergem em casos extremos como lookarounds e grupos nomeados. Quando algo para de funcionar em um aplicativo, o dialeto geralmente é a causa.
- Não usar parênteses para substituição. Se você quer manter parte do que combinou, tem que capturar. Sem parênteses você não pode referenciar nada com $1 ou \1.
Um pequeno fluxo que vai te tornar rápido
Quando você precisa limpar um documento, não comece escrevendo a regex perfeita. Comece selecionando duas ou três linhas de exemplo do texto bagunçado e colando-as em um testador de regex. Digite uma versão literal de um exemplo, depois atualize um pedaço por vez: substitua os dígitos por \d+, substitua o nome variável por \w+, substitua a pontuação que pode variar por uma classe de caracteres. Após cada atualização, verifique se o texto de teste ainda combina e se você não começou a pegar coisas que não queria.
Uma vez que o padrão esteja certo, copie-o para a caixa Localizar do documento real e rode uma única substituição para ver se ele se comporta da mesma forma em escala. Se o documento é importante, trabalhe em uma cópia e use Desfazer agressivamente. Em uma semana fazendo isso duas ou três vezes você começará a escrever padrões de memória para as limpezas que faz com mais frequência, e a primeira coisa que você vai pegar em qualquer exportação bagunçada não será mais um clique-clique-clique manual mas um pequeno padrão que faz tudo de uma vez.
Para onde ir a partir daqui
Os padrões e receitas acima cobrirão a vasta maioria das tarefas diárias de limpeza, extração e reformatação de texto. Quando você estiver pronto para se aprofundar, pesquise lookaheads ((?=...)), lookbehinds ((?<=...)), grupos não capturadores ((?:...)) e capturas nomeadas ((?<year>\d{4})). Não são necessários para o trabalho diário, mas desbloqueiam padrões mais elegantes quando você encontra texto genuinamente complicado.
Regex recompensa prática curta e frequente mais do que qualquer outra habilidade técnica. Mantenha um arquivo de notas com as cinco receitas que você mais usa, cole novas conforme as descobre, e em alguns meses você será a pessoa do escritório a quem todos perguntam quando a planilha deles está uma bagunça. Esse é um lugar surpreendentemente agradável para se estar.