Testador, depurador e explicador de expressões regulares online
Crie, teste e depure expressões regulares com uma árvore sintática de verdade, as posições de cada grupo de captura, avisos de backtracking catastrófico e exportação de código para dez linguagens, tudo dentro do seu separador.
- Dentro de [ ] o ponto já é literal, por isso escapá-lo é desnecessário.
Clique num destaque para selecionar essa correspondência. Mantenha Alt para ver o texto em bruto; F3 e Shift+F3 percorrem as correspondências.
Sem correspondências
O padrão é válido, só não ocorre neste texto. Verifique as flags: sem g apenas a primeira correspondência é reportada.
[\w.%+-]+Repete uma ou mais vezes — ganancioso: apanha tudo o que pode e só devolve se for mesmo obrigado[\w.%+-]Qualquer caractere de: \w . % + -
@O caractere «@»[\w.-]+Repete uma ou mais vezes — ganancioso: apanha tudo o que pode e só devolve se for mesmo obrigado[\w.-]Qualquer caractere de: \w . -
\.O caractere «.», tomado à letra[A-Za-z]{2,}Repete pelo menos 2 vezes — ganancioso: apanha tudo o que pode e só devolve se for mesmo obrigado[A-Za-z]Qualquer caractere de: A–Z a–z
Como funciona
Escreva o padrão
Escreva-o, escolha um da biblioteca, ou cole uma ligação que lhe tenham partilhado. O padrão é colorido conforme o que cada peça é de facto, e os erros ficam sublinhados onde acontecem.
Ajuste flags e modo
Ligue g, i, m, s, u, v, y e d, e depois escolha se está a procurar, a substituir ou a dividir. Desligue o modo ao vivo se preferir que nada corra até carregar no botão.
Execute em segurança
A procura acontece num Web Worker com um limite de dois segundos. Cada correspondência volta com as suas posições e os seus grupos, e o painel avisa-o antes de um padrão que podia não acabar nunca.
Leve-o consigo
Copie a regex, exporte as correspondências em JSON ou CSV, gere o código equivalente para dez linguagens, ou envie o resultado diretamente para outra ferramenta oLoveTools.
Um parser, não um tokenizador
O padrão é analisado numa árvore sintática de verdade, por isso a explicação mostra o que contém o quê — e acerta nos grupos nomeados. Um tokenizador lê (?<year>\d{4}) como um grupo de captura seguido de um algo opcional; um parser lê o grupo nomeado que aquilo é.
O motor corre onde pode ser morto
A procura acontece num Web Worker com temporizador de vigia. Medido aqui, (a+)+$ contra 31 caracteres leva mais de quatro minutos de CPU pura no mesmo motor que o seu navegador usa. Na página isso é um separador morto; num worker é uma execução terminada ao fim de dois segundos.
Correspondências com posições reais
A flag d é ligada nos bastidores, por isso cada grupo de captura traz onde começa e onde acaba, não só o que apanhou. É isso que pinta os grupos dentro de uma correspondência destacada e o deixa saltar da lista para os caracteres exatos.
Avisa antes de se queimar
Quantificadores aninhados sobre caracteres que se sobrepõem, quantificadores à volta de algo que pode não consumir nada, retrorreferências para grupos que não existem, \p{…} sem a flag u e lookbehind num navegador velho de mais — tudo assinalado antes de correr o que quer que seja.
Exporta para dez linguagens
JavaScript, TypeScript, Python, Java, C#, PHP, Go, Rust, Ruby e grep/sed, com as flags traduzidas como deve ser e a substituição reescrita na sintaxe própria de cada linguagem. Os excertos de Go e Rust dizem-no quando o padrão usa algo que o RE2 não sabe fazer.
Encadeada com o resto da suite
Envie o texto substituído, as partes divididas ou as correspondências em JSON diretamente para o WordFlow, DiffSnap, JSONFlow, CodeCard ou HashBolt — sem passar pela pasta de transferências.
Um testador de regex que não consegue pendurar o navegador
As expressões regulares são a única coisa que um testador tem de executar antes de estarem corretas, e uma incorreta pode ser patológica: um padrão como (a+)+$ contra uma cadeia que quase corresponde leva tempo exponencial, e o motor do navegador não tem forma de se interromper. O RegexFlow executa cada procura dentro de um Web Worker com uma vigia de dois segundos. Se a execução se alonga, o worker é terminado e substituído, e recebe uma mensagem em vez de um separador congelado com o seu padrão preso lá dentro.
Nada sai do separador
O padrão, o texto de teste, a substituição e qualquer ficheiro que abra são processados inteiramente no seu navegador — não há upload nem ida e volta a um servidor. Os ficheiros são lidos com o próprio FileReader do navegador. A única coisa que pode sair é uma ligação para partilhar, e só quando carrega no botão que a constrói.
De um padrão que funciona a código que funciona
Análise de logs que tem de sobreviver a uma linha malformada, validação que tem de rejeitar tanto como aceitar, um procurar-e-substituir por todo um repositório onde $1 tem de cair no sítio certo, e aquele momento em que herda o padrão de quarenta caracteres de outra pessoa e precisa de saber o que faz antes de lhe tocar. A árvore de explicação, as posições e a tabela de grupos são para esse momento.
A procura usa o RegExp do seu próprio navegador, por isso o que vê é exatamente o que o seu JavaScript vai fazer — incluindo as partes que variam, e é por isso que a ferramenta verifica o suporte de lookbehind e de unicodeSets em vez de o assumir. Quando exporta para Python, Go ou Rust, as diferenças são explicadas em vez de produzirem em silêncio um excerto que não compila.
Perguntas frequentes
QO meu padrão ou o meu texto de teste são enviados para algum lado?
Não. Tudo corre em JavaScript dentro do seu separador, incluindo os ficheiros que abre: são lidos com o FileReader do navegador e nunca enviados. Pode desligar-se da internet e a ferramenta continua a funcionar.
QO que acontece se escrever um padrão que nunca acaba?
É morto. A procura corre num Web Worker com uma vigia de dois segundos; se o worker não responder a tempo é terminado e um novo ocupa o lugar. Isto importa mais do que parece: medido no mesmo motor que o seu navegador usa, (a+)+$ contra 31 caracteres correu mais de quatro minutos. No fio principal isso é um separador que não recupera.
QQue motor de expressões regulares é usado?
O RegExp nativo do seu navegador, por isso o que testa é exatamente o que o seu JavaScript vai fazer. Onde o suporte varia, a ferramenta verifica em vez de assumir: lookbehind (o Safari só o acrescentou na 16.4), a flag v para unicodeSets e a flag d para as posições dos grupos. Se faltar alguma, é-lhe dito, em vez de lhe mostrarem um erro confuso.
QPorque é que a explicação do padrão é uma árvore?
Porque uma lista plana não consegue dizer o que está dentro de quê, e porque um tokenizador erra onde um parser não erra: (?<year>\d{4}) é um grupo nomeado, não um grupo de captura seguido de um caractere opcional. Cada linha está ligada aos caracteres exatos que descreve, por isso passar o rato numa delas destaca-os no padrão.
QA substituição suporta $1 e grupos nomeados?
Sim: de $1 a $99, $<nome>, $& para a correspondência inteira, $` e $' para o texto à volta, e $$ para um cifrão literal. Cada token que escreve aparece listado por baixo com aquilo em que se vai tornar, e o código gerado reescreve-os na sintaxe própria de cada destino — \g<nome> para Python, ${nome} para Java e C#.
QPosso usá-lo num ficheiro grande?
Sim, mas acima dos 40 000 caracteres a ferramenta deixa de reavaliar sozinha e espera que carregue em Executar — procurar num ficheiro grande a cada tecla é trabalho desperdiçado. Também pode desligar o modo ao vivo em qualquer tamanho e ficar totalmente em manual.
QPorque é que o código Go gerado vem com um aviso?
Go e Rust usam RE2, que é de tempo linear por desenho e por isso não tem lookahead, nem lookbehind, nem retrorreferências. Se o seu padrão usar algum deles, o excerto é mostrado à mesma, mas com uma nota a dizer que não compila tal como está — o que é mais útil do que um excerto que falha em silêncio.
QO que significam as cores no texto de teste?
Cada correspondência tem contorno fúcsia e a selecionada fica mais viva. Dentro da selecionada, os grupos de captura têm o seu próprio trecho violeta, por isso vê exatamente que caracteres foram parar a $1. Mantenha Alt para esconder todos os destaques e ler o texto tal como ele é.