Utilia

Diagrama de regex (railroad)

Transforma uma expressão regular JavaScript num diagrama railroad claro, com grupos, alternativas, ciclos e lookarounds, e exporta-o em SVG ou PNG.

Flags: qualquer uma de d g i m s u v y. Também podes colar um literal como /\d+/g.

Grupos de captura
–
Alternativas
–
Quantificadores
–

Diagrama railroad

Azul: texto literal. Verde: tipos e conjuntos de caracteres (vermelho: conjunto excluído). Roxo: âncoras e limites. Laranja: referências anteriores. Caixas tracejadas: grupos e lookarounds. Um caminho por cima de um elemento salta-o; um caminho por baixo repete-o.

Como visualizar uma expressão regular

  1. Escreve ou cola o teu padrão em Expressão regular. Também podes colar um literal JavaScript completo como /^\d{3}-\d{4}$/gm: as barras são removidas e as flags passam automaticamente para a caixa das flags.
  2. Acrescenta as flags de que precisares (qualquer uma de d g i m s u v y). As flags mudam a forma como algumas partes são desenhadas: com m, ^ e $ passam a «início da linha» e «fim da linha»; com s, o ponto passa a «qualquer carácter».
  3. O diagrama atualiza-se enquanto escreves. Desenhar diagrama volta a desenhá-lo quando quiseres, e Exemplo seguinte percorre alguns padrões comuns (email, número de telefone, cor hexadecimal, preço, etiqueta HTML, URL).
  4. Lê o diagrama da esquerda para a direita, do ponto cheio até ao ponto com anel. Cada caminho que consegues seguir é uma cadeia que o padrão pode reconhecer.
  5. Usa Transferir SVG para uma imagem vetorial nítida (documentação, apresentações), Transferir PNG para uma imagem com o dobro da resolução, ou Copiar código SVG para colar o markup numa página web.

Passa o rato sobre uma caixa para veres a parte do padrão de onde ela vem e a respetiva posição.

Como ler um diagrama railroad

Os diagramas railroad, também chamados diagramas de sintaxe, descrevem uma gramática como um conjunto de linhas de comboio. Uma expressão regular é exatamente esse tipo de gramática, por isso o desenho mostra a estrutura muito melhor do que uma linha densa de símbolos:

  • As caixas azuis são texto literal que tem de aparecer tal como está escrito, por exemplo “@”.
  • As caixas verdes são tipos de caracteres (\d algarismo, \w carácter de palavra, . qualquer carácter…) e classes de caracteres. Uma classe como [\w.+-] passa a uma caixa com o título «um de» que enumera cada elemento; uma classe negada [^…] fica a vermelho com o título «nenhum de».
  • As pílulas roxas são âncoras e limites: início e fim do texto ou da linha, \b limite de palavra. Correspondem a uma posição, não a um carácter.
  • As caixas laranja tracejadas são referências anteriores como \1 ou \k<name>: o mesmo texto que um grupo capturou antes.
  • As molduras tracejadas são grupos. Os grupos de captura são numerados pela ordem do parêntese de abertura («grupo #2 «domain»»); os grupos sem captura (?:…) não têm moldura. Os lookaheads e lookbehinds têm uma moldura cor-de-rosa com a indicação «seguido de» ou «precedido de», porque verificam o texto sem o consumir.
  • As linhas paralelas são alternativas separadas por |.
  • Uma linha por cima de um elemento permite saltá-lo (?, *, {0,n}). Uma linha por baixo com uma seta volta atrás para o repetir (+, *, {n,m}). As contagens fora do habitual aparecem escritas debaixo do ciclo, como «2 a 5 vezes», e os quantificadores preguiçosos (+?, *?) têm a marca «preguiçoso».

Mensagens de erro com posição

O padrão é verificado pelo próprio motor de expressões regulares JavaScript do teu navegador, por isso o que esta ferramenta aceita é exatamente o que new RegExp() aceita com as mesmas flags. Quando o motor o rejeita, a ferramenta aponta o carácter problemático com a sua posição e um acento circunflexo por baixo do padrão. Reconhece um ) sem par, um grupo que nunca é fechado, uma classe de caracteres sem ], um quantificador sem nada para repetir (*a, a|+), uma barra invertida isolada no fim e quantificadores {n,m} em que n é maior do que m. Os outros erros, como uma referência a um nome de grupo que não existe, são mostrados com a mensagem do navegador.

A expressão só é compilada para ser validada: nunca é executada sobre nenhum texto e nada sai do teu navegador.

Perguntas frequentes

Que variante de regex suporta esta ferramenta?

Expressões regulares JavaScript (ECMAScript), incluindo grupos com nome, lookbehind, escapes de propriedades Unicode \p{…} e a flag v com classes aninhadas. Os padrões de PCRE, Python ou Java costumam funcionar também, mas a sintaxe própria desses motores, como os quantificadores possessivos ou (?P<name>…), é rejeitada porque o navegador não a suporta.

Porque é que o meu grupo sem captura não aparece numa caixa?

Um grupo como (?:\.[\w-]+) só agrupa elementos para que um quantificador ou uma alternativa se aplique a todos. Não cria nenhuma captura, por isso o diagrama mostra o conteúdo e o ciclo sem moldura, o que mantém o desenho legível. Os grupos com flags em linha têm moldura e a indicação dessas flags.

Qual é a diferença entre a linha de salto e o ciclo?

A linha por cima de um elemento significa «zero vezes é permitido» e a linha por baixo significa «pode ser repetido». ? só tem a linha de cima, + só a de baixo e * tem as duas. Num quantificador como {2,4}, o ciclo leva a indicação «2 a 4 vezes».

Posso usar o diagrama na minha documentação?

Sim. A exportação SVG é um ficheiro vetorial independente com fundo branco e linhas escuras, ideal para ficheiros README, wikis e apresentações. A exportação PNG é gerada com o dobro do tamanho do desenho no ecrã, para ficar nítida em ecrãs de alta densidade.

Há um limite de tamanho?

Os padrões podem ter até 5000 caracteres. Expressões muito longas dão origem a um diagrama largo que podes percorrer na horizontal; dividi-las em partes com nome facilita muitas vezes a manutenção tanto do diagrama como da regex.