Como Testar uma Expressão Regular Online (Com Exemplos Reais)
Para testar uma expressão regular, escreva o padrão, escolha as flags que o comportamento exige (g para todas as ocorrências, i para ignorar maiúsculas, m para âncoras por linha, s para o ponto casar quebras de linha) e rode contra um texto de teste real. Depois disso, confira duas coisas antes de colar o regex no código: os trechos destacados como match e o conteúdo de cada grupo capturado. Pular essa segunda checagem é como assinar um contrato sem ler a cláusula 4.
O que compõe um padrão e suas flags
Uma expressão regular, ou regex, é uma sequência de caracteres que descreve um padrão de busca em texto. Na notação clássica, o padrão fica entre delimitadores de barra, como em /\d{4}-\d{2}-\d{2}/, e as flags vêm logo depois da barra final para ajustar o comportamento do motor de busca.
O testador de regex de pluri.tools segue exatamente essa notação e oferece quatro flags:
- g (global): encontra todas as ocorrências no texto, não apenas a primeira. Sem essa flag, o motor de regex para assim que acha um resultado.
- i (case-insensitive): ignora a diferença entre maiúsculas e minúsculas, então
abccasa tantoABCquantoAbC. - m (multiline): faz
^e$corresponderem ao início e ao fim de cada linha do texto, em vez de apenas ao início e ao fim da string inteira. - s (dotAll): faz o
.também casar quebras de linha. Por padrão, o ponto casa qualquer caractere exceto\n; com essa flag, ele passa a casar literalmente qualquer caractere.
Parênteses () dentro do padrão criam grupos de captura: além de fazer parte do match geral, o conteúdo casado por aquele trecho fica disponível separadamente. Grupos nomeados, como (?<year>\d{4}), funcionam do mesmo jeito, mas com um rótulo em vez de um número, o que deixa o resultado mais legível quando o padrão tem vários grupos.
Exemplos comentados
A tabela abaixo reúne quatro padrões comuns no dia a dia de quem valida formulários, escreve rotas de API ou faz parsing de arquivo de estilo.
| Pattern | Flags | Corresponde | Não corresponde | Captura |
|---|---|---|---|---|
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$ | nenhuma | jane.doe@example.com | jane@example (sem domínio de topo) | nenhuma |
#([0-9a-fA-F]{6}|[0-9a-fA-F]{3}) | g | #2F7BFF, #fff | #12G456 (G não é hexadecimal) | Grupo 1: 2F7BFF |
\/(\w+)\/(\w[\w-]*) | g | /users/123, /products/abc-456 | /users (sem segundo segmento) | Grupo 1: tipo de recurso, Grupo 2: id |
^\d{4}-\d{2}-\d{2}$ | nenhuma | 2026-07-11 | 07/11/2026 (formato errado) | nenhuma |
Validador de rota de API
Pegue \/(\w+)\/(\w[\w-]*) com a flag g ligada. A primeira \/ casa uma barra literal (o \ escapa a barra porque, em algumas notações, ela seria confundida com o delimitador do padrão). Depois vem (\w+), um grupo que captura uma ou mais letras, números ou underscore, sem limite de tamanho: é aí que entra users ou products. Segue outra \/ literal e então (\w[\w-]*), um segundo grupo que exige começar com um caractere alfanumérico e depois aceita também hífen, o que cobre tanto um ID numérico simples como 123 quanto um slug como abc-456.
Jogue uma lista de caminhos de API no campo de teste, tipo /users/123, /products/abc-456 e /users sozinho. Com a flag g ativa, o testador encontra as duas primeiras ocorrências completas e ignora a terceira, porque /users não tem o segundo segmento que o padrão exige. Cada match aprovado devolve dois grupos: o Grupo 1 (users, products) dá o tipo de recurso, o Grupo 2 (123, abc-456) dá o identificador. Na prática, isso é a base de um roteador simples: você recebe uma URL, roda esse regex e já sabe para qual handler despachar a requisição e qual ID usar na consulta, sem precisar dividir a string na mão com split('/') e lidar com índices fora do array.
Extrator de cores hexadecimais
Agora #([0-9a-fA-F]{6}|[0-9a-fA-F]{3}), também com g. O # literal ancora o padrão no símbolo que abre um valor de cor CSS. O grupo de captura tem uma alternância: [0-9a-fA-F]{6} casa exatamente seis dígitos hexadecimais (o formato longo, tipo 2F7BFF), e [0-9a-fA-F]{3} casa exatamente três (o formato curto, tipo fff). O motor tenta a primeira alternativa e só recorre à segunda se a primeira não fechar.
Aqui a flag g não é opcional, é o ponto inteiro do exercício. Sem ela, o testador encontraria só a primeira cor do texto e pararia, o que é inútil se você está varrendo um arquivo global.css inteiro atrás de toda cor usada. Com g ligada, cada ocorrência de # seguida de 3 ou 6 dígitos hex vira um match separado, cada um com seu próprio Grupo 1 contendo o valor sem o #. Isso é exatamente o tipo de tarefa que aparece ao auditar uma paleta de marca: colar o CSS inteiro no campo de teste e ver, em segundos, cada cor distinta que o arquivo referencia, sem abrir um editor e fazer Ctrl+F um por um.
Teste você mesmo
Escreva seu próprio padrão, cole um texto de teste e veja os matches e grupos capturados na hora.
Erros comuns e casos extremos
Esquecer a flag g. Sem ela o regex para na primeira correspondência, quebrando silenciosamente qualquer coisa que espere todas as ocorrências, como uma função de “substituir tudo” num editor de texto ou um extrator que deveria varrer o arquivo inteiro. O padrão funciona, o código roda sem erro, mas só o primeiro resultado aparece, e esse tipo de bug costuma passar despercebido em teste manual porque o primeiro caso quase sempre está certo.
O ponto sem escape. Um . sem escape corresponde a qualquer caractere, não a um ponto literal. O padrão 192.168.1.1 na verdade também casa com 192X168X1X1, porque cada ponto vira um coringa que aceita qualquer coisa naquela posição. Use \. para significar um ponto literal, e faça esse ajuste sempre que o padrão precisar validar um IP, um domínio ou qualquer texto onde o ponto é pontuação de verdade, não um placeholder.
Quantificadores gulosos vs preguiçosos. .* pega o máximo possível (guloso), podendo ir muito além do esperado. Um exemplo clássico é tentar casar uma tag HTML com <.*>: em vez de parar na primeira >, o padrão guloso avança até a última > de todo o bloco de HTML, capturando várias tags de uma vez como se fossem uma só. .*? (preguiçoso, com o ? depois do quantificador) para no primeiro ponto possível, então <.*?> casa exatamente uma tag por vez.
Âncoras ausentes. Sem ^ e $, um padrão pode casar como substring em qualquer lugar do texto, então um padrão de “validação” sem âncoras pode aprovar uma string que apenas contém uma parte válida, deixando entrada inválida passar. É o caso de um regex de e-mail sem ^...$: ele aceitaria not-an-email but jane@example.com is here, porque o trecho válido no meio da frase já satisfaz o padrão. ^ e $ forçam a string inteira a corresponder, do primeiro ao último caractere, fechando essa brecha.
Perguntas frequentes
Qual é a diferença real entre usar a flag g e não usá-la? Sem g, o motor de regex devolve só a primeira ocorrência encontrada e para de procurar, mesmo que existam outras mais adiante no texto. Com g, ele continua varrendo até o fim da string e devolve todas as ocorrências, cada uma com sua própria posição e seus próprios grupos capturados. A escolha depende do que você precisa: extrair um único valor pede regex sem g, enquanto substituir ou listar todas as ocorrências exige g.
Como faço para casar um caractere especial literal, como um ponto, cifrão ou parêntese?
Coloque uma barra invertida antes do caractere: \. para um ponto literal, \$ para um cifrão literal, \( e \) para parênteses literais. Esses caracteres têm significado especial dentro de um regex (o ponto é um coringa, o cifrão ancora o fim da string, os parênteses abrem um grupo), e o escape com \ avisa ao motor que você quer o símbolo em si, não o comportamento especial dele.
O que é um grupo não capturante, (?:...), e quando preciso dele em vez de um grupo (...) normal?
Um grupo não capturante agrupa parte do padrão, para aplicar um quantificador ou uma alternância a ele, mas sem gerar uma entrada separada na lista de grupos capturados. Use (...) quando você realmente vai usar o valor daquele trecho depois (num ID, numa data, num segmento de URL), e use (?:...) quando só precisa agrupar por causa da sintaxe, por exemplo para aplicar {2,4} a uma sequência de caracteres sem poluir a numeração dos grupos que você de fato quer capturar.
Esta ferramenta envia meu padrão ou texto de teste para algum lugar? Não. Todo o processamento roda inteiramente no seu navegador, usando o motor JavaScript RegExp nativo. Nada do que você digita no campo de padrão ou no texto de teste é enviado a um servidor.