BrowserTools
Publicidade
Início / Validadores / Testador e Depurador de Regex

Testador e Depurador de Regex

Testa expressões regulares de JavaScript ao vivo com realce de correspondências, grupos de captura e pré-visualização de substituição.

A carregar Testador e Depurador de Regex… Se nada acontecer, ativa o JavaScript.

As expressões regulares (regex ou regexp) são uma linguagem formal para descrever padrões em texto. A teoria remonta ao matemático Stephen Cole Kleene, que formalizou a álgebra das linguagens regulares em 1956, e a Ken Thompson, que implementou regex no editor QED e nas ferramentas originais do Unix grep, sed e awk nas décadas de 1960 e 1970. Os motores de regex modernos ampliam o fundamento teórico com funcionalidades práticas como as antevisões (lookaheads), as retrorreferências (backreferences) e os grupos de captura nomeados, o que faz delas uma das ferramentas de processamento de texto mais poderosas disponíveis em qualquer linguagem de programação.

Exemplos

Entrada \b\w+@\w+\.\w+\b on "a@b.com x@y.org"
Saída 2 matches: a@b.com, x@y.org

Os grupos de captura e as flags (g, i, m) são mostrados ao vivo à medida que escreves.

Perguntas frequentes

A minha entrada é enviada para um servidor?
Não. A expressão regular é avaliada inteiramente no teu navegador usando o motor nativo RegExp do JavaScript. O teu padrão, a tua cadeia de teste e qualquer modelo de substituição nunca saem do teu dispositivo e nunca são transmitidos pela rede.
Que variante de regex usa esta ferramenta?
Esta ferramenta usa o motor de regex do JavaScript (ECMAScript) através do construtor nativo RegExp. Suporta todas as funcionalidades padrão do ES2024, incluindo os grupos de captura nomeados (?<name>...), as asserções de retrospeção lookbehind ((?<=...) e (?<!...)), a flag dotAll (s), a flag Unicode (u), a flag de índices (d) e a recém-acrescentada flag v para a notação de conjuntos Unicode. Não suporta funcionalidades específicas de PCRE como os padrões recursivos ou os quantificadores possessivos.
Quando devo usar uma regex em vez de métodos de cadeia simples?
Para pesquisas simples de cadeias fixas, String.prototype.includes() ou indexOf() é mais rápido e legível do que uma regex. Recorre a uma regex quando precisares de correspondência de padrões (por exemplo, 'começa por um dígito'), alternância (corresponder a 'cat' ou 'dog'), classes de caracteres (corresponder a qualquer vogal), quantificadores (corresponder a um ou mais dígitos) ou grupos de captura para extrair subcorrespondências. A regex destaca-se em tarefas de validação, extração e transformação onde o padrão alvo tem uma estrutura que não pode ser expressa como uma única cadeia literal.
Em que difere a regex do JavaScript da PCRE (Python, PHP, Perl)?
A variante de regex do JavaScript é semelhante à PCRE mas tem algumas diferenças notáveis. O JavaScript não suporta grupos atómicos, quantificadores possessivos nem padrões recursivos. A asserção \K (keep) disponível na PCRE está ausente no JavaScript. Os grupos de captura nomeados usam a sintaxe (?<name>...) no JavaScript, em vez de (?P<name>...) no Python. A flag global (g) no JavaScript afeta a propriedade com estado lastIndex do objeto RegExp, o que pode provocar erros subtis ao reutilizar um objeto regex num ciclo.
Quais são as flags disponíveis e o que fazem?
As principais flags de regex do JavaScript são: g (global), encontrar todas as correspondências em vez de parar na primeira; i (sem distinção entre maiúsculas e minúsculas), tratar maiúsculas e minúsculas como equivalentes; m (multilinha), fazer ^ e $ corresponderem aos limites de linha em vez dos limites de cadeia; s (dotAll), fazer o ponto (.) corresponder às mudanças de linha; u (Unicode), ativar a correspondência Unicode completa e os escapes de ponto de código; e d (índices), incluir os índices de início e fim de cada correspondência e grupo de captura no resultado.
Existe um limite para o comprimento da cadeia de teste ou do padrão?
Não há um limite rígido imposto pela ferramenta, mas padrões muito longos ou cadeias de teste muito grandes podem fazer o navegador deixar de responder, sobretudo se o padrão incluir quantificadores aninhados que possam desencadear um retrocesso catastrófico. Padrões com retrocesso não limitado em entradas grandes podem consumir CPU indefinidamente. Se o separador do navegador congelar, fecha-o e volta a abri-lo. Para uso em produção, testa sempre os padrões de regex em relação a entradas adversárias antes de os implementares.
Posso usar isto para testar um padrão de substituição?
Sim. Introduz uma cadeia de substituição no campo de substituição e a ferramenta mostrará uma pré-visualização ao vivo da saída após aplicar String.prototype.replace (para a primeira correspondência) ou replaceAll (com a flag g). É suportada a sintaxe de substituição padrão: $1 e $2 para os grupos de captura numerados, $<name> para os grupos de captura nomeados, $& para toda a cadeia correspondida, $` para o texto anterior à correspondência e $' para o texto posterior à correspondência.
O que é o retrocesso catastrófico e como o evito?
O retrocesso catastrófico ocorre quando um motor de regex explora um número exponencial de possíveis caminhos de correspondência numa cadeia que não corresponde ao padrão. Surge normalmente de quantificadores aninhados sobre classes de caracteres que se sobrepõem, por exemplo, (a+)+ numa longa cadeia de caracteres 'a' seguida de um carácter que não pode corresponder. Para o evitar: prefere padrões atómicos, usa quantificadores possessivos se estiverem disponíveis, evita a ambiguidade naquilo a que cada parte do padrão pode corresponder e testa sempre com entradas concebidas para falhar, além de entradas concebidas para ter êxito.
Qual é a diferença entre um grupo de captura e um sem captura?
Um grupo de captura (...) corresponde ao padrão dentro dos parênteses e armazena o texto correspondido para que possa ser referenciado mais tarde através de $1, $2 ou dos índices de grupo. Um grupo sem captura (?:...) agrupa o padrão para fins de quantificação ou alternância sem armazenar a correspondência, o que o torna ligeiramente mais eficiente. Os grupos nomeados (?<name>...) são grupos de captura que podem ser referenciados pelo nome ($<name> nas substituições, match.groups.name no código JavaScript) em vez de pelo índice.
Qual é um erro comum de principiante com as expressões regulares?
Um dos erros mais comuns é esquecer-se de escapar o ponto (.) quando se pretende um ponto literal. O ponto numa regex corresponde a qualquer carácter (exceto a mudança de linha, por predefinição), por isso um padrão como 3.14 também corresponderá a 3X14 ou 3-14. Escreve 3\.14 para corresponder a um ponto literal. Outro erro frequente é omitir a flag global (g) e questionar-se por que só a primeira correspondência é realçada. Uma terceira armadilha é ancorar com ^ e $ e surpreender-se por corresponderem aos limites de linha apenas quando a flag multilinha (m) está ativada.

Sobre Testador e Depurador de Regex

As expressões regulares são indispensáveis para uma ampla variedade de tarefas do mundo real. A validação de formulários, verificar se um endereço de e-mail, um número de telefone ou um código postal correspondem ao formato esperado, usa quase universalmente regex. Os analisadores de logs extraem campos estruturados de linhas de log não estruturadas usando grupos de captura. Os editores de código e os IDE usam regex para procurar e substituir em grandes bases de código. As ferramentas de segurança usam regex para detetar padrões de injeção e fugas de dados sensíveis. Os pipelines de transformação de dados usam regex para normalizar formatos inconsistentes. As configurações de dispositivos de rede são auditadas com regex. Compreender e depurar um padrão de regex de forma interativa é muito mais rápido do que executar um script repetidamente.

Este testador avalia expressões regulares de JavaScript em relação à tua entrada em tempo real, realçando cada correspondência à medida que escreves. Lista todos os grupos de captura (numerados e nomeados) de cada correspondência para que possas ver de imediato o que cada grupo capturou. Um modo de substituição permite-te escrever um modelo de substituição e pré-visualizar o resultado de String.prototype.replace ou replaceAll, com suporte para as retrorreferências $1, $2 e $<name>. Tudo corre inteiramente no motor de JavaScript do teu navegador; os teus padrões e o teu texto de entrada nunca são enviados para qualquer servidor.

A regex é célebre por ser fácil de errar de forma subtil. Um ponto isolado (.) corresponde a qualquer carácter, incluindo as mudanças de linha em alguns modos, não apenas a um ponto literal. Os quantificadores gananciosos (*, +) correspondem ao máximo possível, capturando muitas vezes mais do que o pretendido; usa as versões preguiçosas (*?, +?) para corresponder ao mínimo possível. As âncoras ^ e $ correspondem ao início e ao fim de toda a cadeia por predefinição; acrescenta a flag multilinha (m) se quiseres que correspondam nos limites de linha. O retrocesso catastrófico, em que uma regex mal escrita provoca um tempo de correspondência exponencial com uma entrada adversária, é um risco real de negação de serviço em aplicações web que aplicam padrões fornecidos pelo utilizador a texto fornecido pelo utilizador.

Da teoria das linguagens formais ao grep

O conceito de expressões regulares tem origem na informática teórica. Em 1956, o matemático Stephen Cole Kleene publicou um artigo que descrevia os 'eventos regulares', conjuntos de cadeias que podiam ser descritos por um autómato finito, e introduziu a notação algébrica que viria a tornar-se a sintaxe de regex. O operador estrela (*), chamado a estrela de Kleene, tem o seu nome. Nessa altura, as expressões regulares eram puramente uma abstração matemática sem ligação à prática da computação.

O salto da teoria para a ferramenta chegou em 1968, quando Ken Thompson implementou a pesquisa com regex no editor de texto QED e depois na ferramenta do Unix grep (cujo nome vem de 'globally search a regular expression and print'). A inovação fundamental de Thompson foi um algoritmo eficiente que convertia uma expressão regular num autómato finito não determinista (NFA) e o simulava, garantindo uma correspondência em tempo linear sem retrocesso catastrófico. Muitos motores de regex modernos abandonaram a abordagem NFA de Thompson a favor de motores com retrocesso que suportam mais funcionalidades (como as retrorreferências) mas que podem apresentar um comportamento exponencial no pior dos casos.

Hoje, as expressões regulares são suportadas nativamente em praticamente todas as linguagens de programação e editores de texto. No entanto, a sintaxe fragmentou-se em dezenas de variantes incompatíveis, POSIX BRE, POSIX ERE, PCRE, .NET, Java, Python, JavaScript, Ruby, cada uma com subtis diferenças na sintaxe e na semântica. Uma regex escrita para uma linguagem funcionará muitas vezes noutra, mas os casos-limite abundam. Esta fragmentação é a razão pela qual se recomenda sempre testar um padrão no motor concreto que vais realmente usar antes de o implementar em produção.

Publicidade
Publicidade
Publicidade