Utilia

Testador de regex

Testa expressões regulares JavaScript em tempo real, com correspondências destacadas, grupos de captura, substituição e explicação de cada parte.

Flags

Correspondências
#PosiçãoCorrespondênciaGrupos

Explicação do padrão

    Como usar o testador de regex

    1. Escreve o teu padrão em Expressão regular, sem as barras à volta. As barras e as flags ativas aparecem em redor do campo, como em /padrão/g.
    2. Marca as Flags de que precisas: g (global), i (ignorar maiúsculas/minúsculas), m (multilinha), s (dotAll), u (unicode) ou y (sticky).
    3. Cola o texto onde queres pesquisar em Texto de teste. As correspondências ficam destacadas enquanto escreves, e a tabela lista cada uma com a posição e os grupos de captura.
    4. Para experimentar uma substituição, preenche Substituição. A caixa Resultado depois da substituição mostra o texto com todas as correspondências substituídas, pronto a copiar.
    5. Lê a Explicação do padrão para confirmares o que faz cada parte da tua regex. Não sabes por onde começar? Clica em Carregar um exemplo.

    O que o testador mostra

    • Correspondências destacadas: cada correspondência no texto de teste fica marcada, para veres de relance o que é apanhado e o que escapa.
    • Tabela de correspondências: o número de cada correspondência, a posição (o deslocamento em caracteres desde o início, a contar de 0), o texto encontrado e o valor de cada grupo de captura. Os grupos com nome, como (?<year>\d{4}), aparecem com o respetivo nome, e os grupos que não participaram na correspondência aparecem como «(sem correspondência)». São listadas as primeiras 1000 correspondências.
    • Substituição: o texto de substituição usa a sintaxe do JavaScript: $1 ou $2 para grupos numerados, $<name> para grupos com nome, $& para a correspondência inteira e $$ para um cifrão literal. Sem a flag g, só a primeira correspondência é substituída.
    • Explicação: o padrão é dividido em elementos (texto literal, classes de caracteres, âncoras, grupos, quantificadores, lookarounds, referências anteriores), cada um com uma descrição curta. Os grupos aninhados aparecem indentados, o que torna os padrões longos muito mais fáceis de rever.

    As flags em resumo

    Flag Efeito
    g Encontra todas as correspondências em vez de parar na primeira
    i Ignora a diferença entre maiúsculas e minúsculas
    m ^ e $ correspondem ao início e ao fim de cada linha
    s . também apanha quebras de linha
    u Modo Unicode completo: \u{…}, \p{…} e emojis tratados como um único carácter
    y Sticky: cada correspondência tem de começar exatamente onde a anterior terminou

    Backtracking catastrófico

    Alguns padrões demoram um tempo exponencial em textos que quase correspondem. O exemplo clássico é (a+)+$ testado contra uma longa sequência de a seguida de um b: o motor experimenta todas as formas de repartir os a pelos dois quantificadores antes de desistir. Este problema, conhecido como ReDoS, já deitou abaixo sites reais.

    Esta ferramenta protege o teu navegador de três formas. A pesquisa corre num worker em segundo plano que é interrompido ao fim de 1,5 segundos; o texto de teste está limitado a 100 000 caracteres; e a explicação avisa-te quando um grupo repetido contém outro quantificador sem limite. Se um padrão exceder o tempo, reescreve-o para que cada carácter só possa corresponder de uma maneira, por exemplo a+$ em vez de (a+)+$.

    Perguntas frequentes

    Que variante de regex usa esta ferramenta?

    Usa o motor JavaScript (ECMAScript) do teu navegador, exatamente como new RegExp() e String.prototype.replace() fariam no teu código. A maior parte da sintaxe é comum ao PCRE, ao Python e ao Java, mas há diferenças: os quantificadores possessivos e os grupos atómicos não existem em JavaScript, e o lookbehind é suportado em todos os navegadores atuais.

    Porque é que o meu padrão só encontra uma correspondência?

    A flag g está desligada. Sem ela, o JavaScript para depois da primeira correspondência e a substituição só altera essa.

    Como procuro um ponto, um parêntese reto ou um ponto de interrogação literais?

    Escapa-os com uma barra invertida: \., \[, \?. A explicação mostra os caracteres escapados com a indicação «(escapado)» para poderes confirmar.

    O meu texto é enviado para algum lado?

    Não. O padrão e o texto são processados apenas no teu navegador, o que torna esta ferramenta segura para ficheiros de registo ou dados com informação pessoal.

    Porque é que a posição é diferente da coluna no meu editor?

    As posições contam caracteres a partir de 0, ao longo de todas as linhas, tal como o match.index do JavaScript. As quebras de linha contam como um carácter, e um emoji fora do Plano Multilingue Básico conta como dois.