Como você depura uma regex? [fechadas]


149

Expressões regulares podem se tornar bastante complexas. A falta de espaço em branco os torna difíceis de ler. Não consigo passar por uma expressão regular com um depurador. Então, como os especialistas depuram expressões regulares complexas?


2
Acredito que "testar" seu regex é muito mais importante do que "depurá-lo". Geralmente, você pode entender o que está acontecendo com uma regex olhando com facilidade o resultado (ou usando uma das ferramentas sugeridas nas respostas), mas para ter certeza de que faz o que você quer dizer, teste sua regex com todos os casos de borda possíveis. Testes acabará por esclarecer o que realmente você quer fazer e fazer a depuração inútil :)
Baol

7
Isto parece interessante: http://www.debuggex.com/ (Desde questão está fechada Eu não posso acrescentar uma resposta real.)
KajMagnus

Se você tiver Visual Studio, você pode definir um ponto de interrupção perto de sua área problema (por exemplo: RegEx.Replace(...), mude para 'janela imediata' e experimentar alguns 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)comandos para rapidamente zero na questão.
DeepSpace101

2
Estou muito surpreso que ninguém parece ter mencionado o regex101.com, que possui um depurador real e também é hospedado na web.
precisa saber é o seguinte

1
mesmo em 2017, acredito que o regexbuddy ainda é a melhor ferramenta que posso encontrar, e o preço permanece em US $ 40. Costumo trabalhar em diferentes idiomas com diferentes tipos de expressões regulares, por isso fico confuso. Com o regexbuddy, ele apenas me liberta da sintaxe
code4j 28/06

Respostas:


68

Você compra o RegexBuddy e usa seu recurso de depuração embutido . Se você trabalha com regexes mais de duas vezes por ano, você ganhará esse dinheiro de volta no tempo economizado em pouco tempo. O RegexBuddy também ajudará você a criar expressões regulares simples e complexas e até a gerar o código para você em uma variedade de idiomas.

texto alternativo

Além disso, de acordo com o desenvolvedor, essa ferramenta roda quase perfeitamente no Linux quando usada com o WINE .


31
Pena que é apenas para Windows e custa US $ 40.
Kennytm

25
É executado no Linux via WINE, de acordo com o desenvolvedor: regexbuddy.com/wine.html . E sobre o custo de US $ 40 ... quanto vale o seu tempo?
Mick

18
Este não é um software livre.
codeholic 27/02

38
Quem disse que era ou pediu?
Tim Pietzcker

21
Bem, como Mick disse, quanto vale o seu tempo? "As melhores ferramentas que o dinheiro pode comprar" nem sempre precisam custar dinheiro, mas às vezes custam. Além disso, a JGSoft desenvolve consistentemente produtos de ótima qualidade com um serviço excepcional ao usuário. Até comprei software deles que realmente não preciso (como o RegexMagic), porque gostaria de apoiá-los e mantê-los nos negócios. Você não sabe o que está perdendo. Seriamente.
Tim Pietzcker

52

Com o Perl 5.10 use re 'debug';,. (Oudebugcolor , mas não consigo formatar a saída corretamente no Stack Overflow.)

$ perl -Mre = depuração -e '"foobar" = ~ / (.) \ 1 /'
Compilando REx "(.) \ 1"
Programa final:
   1: ABRIR1 (3)
   3: REG_ANY (4)
   4: FECHAR1 (6)
   6: REF1 (8)
   8: FIM (0)
minlen 1
Correspondência de REx "(.) \ 1" contra "foobar"
   0 <> <foobar> | 1: ABRIR1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: FECHAR1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  falhou ...
   1 <f> <oobar> | 1: ABRIR1 (3)
   1 <f> <oobar> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: FECHAR1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: FIM (0)
Combine com sucesso!
Liberando REx: "(.) \ 1"

Além disso, você pode adicionar espaços em branco e comentários às expressões regulares para torná-las mais legíveis. No Perl, isso é feito com o /xmodificador. Com pcre, há a PCRE_EXTENDEDbandeira.

"foobar" =~ /
    (.)  # any character, followed by a
    \1   # repeat of previously matched character
/x;

pcre *pat = pcre_compile("(.)  # any character, followed by a\n"
                         "\\1  # repeat of previously matched character\n",
                         PCRE_EXTENDED,
                         ...);
pcre_exec(pat, NULL, "foobar", ...);

12
+1: Por que alguém preferiria o Regexbuddy a isso?
Charles Stewart

1
Eu gosto desse método, mesmo que eu ache o regex buddy melhor.
rook

eco "foobar" | egrep "(.) \ 1"
DmitrySandalov 02/12/13

30

Vou adicionar outro para não esquecer: debuggex

É bom porque é muito visual: Foto do auxiliar de regex Debuggex


debuggex, na verdade, não funciona para mim: as fontes são impostas pelo JavaScript, aparentemente, e não funcionam (tenho fontes monoespaçadas, o console do firefox as usa perfeitamente). Como conseqüência, a exibição é inutilizável. Além disso, o teste de JavaScript trava o navegador com muitos casos de teste, para todas as edições (não apenas uma vez quando acionadas). Por fim, algumas das expressões regulares propostas são corrigidas e não correspondem conforme o pretendido.
7heo.tk

28

Quando fico preso em uma regex, costumo recorrer a isso: https://regexr.com/

É perfeito para testar rapidamente onde algo está errado.


1
Essa ferramenta é realmente útil: é hospedada na Web, portanto não é necessário instalar, é em tempo real, portanto, a depuração é um sonho, e ainda possui dicas úteis e uma lista de caracteres especiais, caso você não consiga se lembrar de algo. É perfeito, muito obrigado
Jason Ridge

Infelizmente, essa ferramenta (ainda) não permite alterar os delimitadores de expressões regulares (mesmo para o mecanismo PCRE) - eles são corrigidos como /(barras). Este é um empecilho para mim.
MrWhite 20/02

19

Eu uso o Kodos - o depurador de expressões regulares do Python:

Kodos é um utilitário da GUI do Python para criar, testar e depurar expressões regulares para a linguagem de programação Python. O Kodos deve ajudar qualquer desenvolvedor a desenvolver expressões regulares de forma eficiente e sem esforço no Python. Como a implementação de expressões regulares do Python é baseada no padrão PCRE , o Kodos deve beneficiar desenvolvedores em outras linguagens de programação que também aderem ao padrão PCRE (Perl, PHP, etc ...).

(...)

texto alternativo

Executa no Linux, Unix, Windows, Mac.


2
O Kodos não fornece recursos de depuração verdadeiros. Você não pode pisar no regex nem pausar a execução.
Candide

Alguma dica sobre como fazê-lo funcionar em um Mac? O site Sourceforge não oferece nenhuma informação sobre a instalação para Mac, e meu Google-fu parece estar falhando comigo.
21812 Adam Parkin

Embora isso pareça Python2 e não seja atualizado desde 2006 (há 14 anos no momento da redação deste artigo)?
MrWhite 23/03

13

Eu acho que eles não. Se o seu regexp for muito complicado e problemático a ponto de você precisar de um depurador, crie um analisador específico ou use outro método. Será muito mais legível e sustentável.


4
Cara, você postou isso depois de olhar para a captura de tela regexbuddy?
rook

2
Todo mundo discorda disso, mas não é uma má idéia. Todos assumem que o mecanismo de regex é mais eficiente com regexes enormes. Isso não é necessariamente verdade, e eles definitivamente não são fáceis de ler. Divida suas regexes.
Dan Rosenstark

1
@ Michael Brooks: Não, antes, na verdade. Tendo visto a captura de tela, estou bem com o fato de que você PODE depurar um regexp. Mas tenho minha ideia: quando uma regexp se torna muito complicada, é hora de mudar para outra maneira.
Valentin Rocher

12

Existe uma excelente ferramenta gratuita, o Regex Coach . A versão mais recente está disponível apenas para Windows; seu autor, Dr. Edmund Weitz, parou de manter a versão Linux porque poucas pessoas fizeram o download, mas há uma versão mais antiga para Linux na página de download.


8

Acabei de ver uma apresentação do Regexp :: Debugger por seu criador: Damian Conway. Coisas impressionantes: execute no local ou usando uma ferramenta de linha de comando (rxrx), interativamente ou em um arquivo de execução "registrado" (armazenado em JSON), avance e retroceda a qualquer momento, pare em pontos de interrupção ou eventos, saída colorida (configurável pelo usuário) ), mapas de calor em regexp e string para otimização, etc ...

Disponível no CPAN gratuitamente: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


O OP disse: "Não consigo passar por uma expressão regular com um depurador".
quantum

Você tem um link para a apresentação?
rook

3
@Rook, você pode ver a apresentação em youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

Eu depuro minhas expressões regulares com meus próprios olhos. É por isso que uso /xmodificador, escrevo comentários para eles e os divido em partes. Leia Mastering Regular Expressions, de Jeffrey Friedl, para aprender a desenvolver expressões regulares rápidas e legíveis. Várias ferramentas de depuração regex apenas provocam a programação vodu.


5

Quanto a mim, eu geralmente uso o utilitário pcretest, que pode despejar o código de bytes de qualquer regex, e geralmente é muito mais fácil de ler (pelo menos para mim). Exemplo:

PCRE version 8.30-PT1 2012-01-01

  re> /ab|c[de]/iB
------------------------------------------------------------------
  0   7 Bra
  3  /i ab
  7  38 Alt
 10  /i c
 12     [DEde]
 45  45 Ket
 48     End
------------------------------------------------------------------


3

Se eu estiver me sentindo travado, gosto de voltar atrás e gerar o regex diretamente de um texto de exemplo usando o txt2re (embora eu geralmente acabe ajustando o regex resultante manualmente).




2

Escrever registros usando uma notação como PCREs é como escrever assembler: tudo bem se você puder ver apenas os autômatos de estados finitos correspondentes em sua cabeça, mas pode ser difícil manter muito rapidamente.

As razões para não usar um depurador são as mesmas de não usar um depurador com uma linguagem de programação: você pode corrigir erros locais, mas eles não ajudarão a resolver os problemas de design que o levaram a cometer erros locais no primeiro Lugar, colocar.

A maneira mais reflexiva é usar representações de dados para gerar regexps em sua linguagem de programação e ter abstrações apropriadas para construí-las. A introdução de Olin Shiver à sua notação de regexp de esquema fornece uma excelente visão geral dos problemas enfrentados no design dessas representações de dados.


Os combinadores de analisadores são realmente um caminho impressionante: Parsec e PArrows em Haskell, rsec em Ruby, Boost Spirit em C ++, PyParsing em Python, Perl6 :: Rules in Perl, etc.
ephemient

2

Costumo usar pcretest - dificilmente um "depurador", mas funciona em uma conexão SSH somente em texto e analisa exatamente o dialeto regex de que preciso: meu código (C ++) vincula-se ao libpcre, portanto não há dificuldade com diferenças sutis no que é mágico e o que não é etc.

Em geral, eu concordo com o cara acima, para quem precisar de um depurador de regex é um cheiro de código. Para mim, o mais difícil de usar regexes geralmente não é o próprio regex, mas as várias camadas de cotação necessárias para fazê-las funcionar.





0

Para mim, depois de observar o regex (como eu sou bastante fluente e quase sempre uso / x ou equivalente), eu poderia depurar em vez de testar se não tenho certeza se conseguiria alguma correspondência degenerada (ou seja, algo que recua demais) para ver se eu poderia resolver esses problemas, modificando a ganância de um operador, por exemplo.

Para fazer isso, eu usaria um dos métodos mencionados acima: pcretest, RegexBuddy (se meu local de trabalho atual o licenciou) ou similar, e às vezes o tempo no Linqpad se estiver trabalhando em regexes C #.

(O truque perl é novo para mim, provavelmente adicionará isso ao meu kit de ferramentas regex também.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.