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.
| # | Posição | Correspondência | Grupos |
|---|
Explicação do padrão
Atenção: um grupo repetido contém outro quantificador sem limite, por exemplo (a+)+. Padrões assim podem demorar um tempo exponencial em textos que quase correspondem (backtracking catastrófico).
Como usar o testador de regex
- 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. - Marca as Flags de que precisas:
g(global),i(ignorar maiúsculas/minúsculas),m(multilinha),s(dotAll),u(unicode) ouy(sticky). - 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.
- 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.
- 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:
$1ou$2para grupos numerados,$<name>para grupos com nome,$¶ a correspondência inteira e$$para um cifrão literal. Sem a flagg, 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.
Ferramentas relacionadas
- Formatador e validador de JSON Formatador e validador de JSON gratuito que formata, minifica e verifica JSON no teu navegador, com os erros de sintaxe indicados por linha e coluna.
- Codificador e descodificador de URL Codificador e descodificador de URL gratuito. Codifica parâmetros ou URLs completos, descodifica sequências %XX e trata + como espaço, no navegador.
- Gerador de hash Gera hashes MD5, SHA-1, SHA-256 e SHA-512 de texto ou de ficheiros de qualquer tamanho e verifica checksums. Tudo corre no teu navegador.