¿Cómo se depura una expresión regular? [cerrado]


149

Las expresiones regulares pueden volverse bastante complejas. La falta de espacio en blanco los hace difíciles de leer. No puedo pasar por una expresión regular con un depurador. Entonces, ¿cómo depuran los expertos las expresiones regulares complejas?


2
Creo que "probar" su expresión regular es mucho más importante que "depurarla". Por lo general, puede darse cuenta de lo que está sucediendo con una expresión regular mirando el resultado con bastante facilidad (o usando una de las herramientas sugeridas en las respuestas), pero para estar realmente seguro de que hace lo que quiere decir, debe probar su expresión regular con todos los casos de borde posibles. Las pruebas con el tiempo aclarará lo que realmente quieres hacer y hacer que la depuración inútil :)
baol

77
Esto parece interesante: http://www.debuggex.com/ (Dado que la pregunta está cerrada, no puedo agregar una respuesta real).
KajMagnus

Si tiene Visual Studio, puede establecer un punto de interrupción cerca de su área problemática (p. Ej .: RegEx.Replace(...), cambie a 'Ventana inmediata' y pruebe algunos 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)comandos para cero rápidamente en el problema.
DeepSpace101

2
Estoy muy sorprendido de que nadie parezca haber mencionado regex101.com que tiene un depurador real y también está alojado en la web.
mechalynx

1
Incluso en 2017, creo que regexbuddy sigue siendo la mejor herramienta que puedo encontrar, y el precio sigue siendo de $ 40. A menudo trabajo en diferentes idiomas con diferente sabor de expresiones regulares, por lo que a menudo me confundo. Con regexbuddy, simplemente me libera de la sintaxis
code4j

Respuestas:


68

Usted compra RegexBuddy y utiliza su función de depuración integrada . Si trabaja con expresiones regulares más de dos veces al año, recuperará este dinero en el tiempo ahorrado en poco tiempo. RegexBuddy también lo ayudará a crear expresiones regulares simples y complejas, e incluso generar el código para usted en una variedad de idiomas.

texto alternativo

Además, según el desarrollador, esta herramienta se ejecuta casi sin problemas en Linux cuando se usa con WINE .


31
Lástima que es solo para Windows y cuesta US $ 40.
kennytm

25
Se ejecuta en Linux a través de WINE, según el desarrollador: regexbuddy.com/wine.html . Y sobre el costo de $ 40 ... ¿cuánto vale su tiempo?
Mick

18
Esto no es software libre.
codeholic

38
¿Quién dijo que era o lo pidió?
Tim Pietzcker

21
Bueno, como dijo Mick, ¿cuánto vale tu tiempo? "Las mejores herramientas que el dinero puede comprar" no siempre tienen que costar dinero, pero a veces lo hacen. Además, JGSoft desarrolla constantemente productos de gran calidad con un servicio de usuario excepcional. Incluso les he comprado software que realmente no necesito (como RegexMagic) porque me gustaría apoyarlos y mantenerlos en el negocio. No sabes lo que te estás perdiendo. Seriamente.
Tim Pietzcker

52

Con Perl 5.10, use re 'debug';. (O bien debugcolor, pero no puedo formatear la salida correctamente en Stack Overflow).

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
Compilando REx "(.) \ 1"
Programa final:
   1: ABIERTO1 (3)
   3: REG_ANY (4)
   4: CERRAR1 (6)
   6: REF1 (8)
   8: FIN (0)
minlen 1
Hacer coincidir REx "(.) \ 1" contra "foobar"
   0 <> <foobar> | 1: ABIERTO1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: CERRAR1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  ha fallado...
   1 <f> <oobar> | 1: ABIERTO1 (3)
   1 <f> <oobar> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: CERRAR1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: FIN (0)
¡Partido exitoso!
Liberando REx: "(.) \ 1"

Además, puede agregar espacios en blanco y comentarios a las expresiones regulares para que sean más legibles. En Perl, esto se hace con el /xmodificador. Con pcre, ahí está la PCRE_EXTENDEDbandera.

"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 qué alguien preferiría Regexbuddy a esto?
Charles Stewart

1
Me gusta este método, aunque creo que regex buddy es mejor.
torre

echo "foobar" | egrep "(.) \ 1"
DmitrySandalov

30

Agregaré otro para no olvidarlo: debuggex

Es bueno porque es muy visual: Foto del ayudante de Debgegex regex


debuggex en realidad no funciona para mí: las fuentes son forzadas por JavaScript, aparentemente, y no funcionan (tengo fuentes monoespaciadas, la consola de firefox las usa perfectamente). Como consecuencia, la pantalla no se puede utilizar. Además, la prueba de JavaScript bloquea el navegador con muchos casos de prueba, para cada edición (no solo una vez cuando se dispara). Finalmente, algunas de las expresiones regulares propuestas tienen errores y no coinciden según lo previsto.
7heo.tk

28

Cuando me atoro en una expresión regular, generalmente me vuelvo a esto: https://regexr.com/

Es perfecto para probar rápidamente dónde algo va mal.


1
Esta herramienta es realmente útil: está alojada en la web, por lo que no es necesario instalarla, es en tiempo real, por lo que la depuración es un sueño, e incluso tiene información sobre herramientas útil y una lista de caracteres especiales, en caso de que no recuerdes algo. Es perfecto, muchas gracias
Jason Ridge

Desafortunadamente, esta herramienta (aún) no le permite cambiar los delimitadores de expresiones regulares (incluso para el motor PCRE), se fijan como /(barras). Este es un espectáculo para mí.
MrWhite

19

Yo uso Kodos - El depurador de expresiones regulares de Python:

Kodos es una utilidad de la GUI de Python para crear, probar y depurar expresiones regulares para el lenguaje de programación Python. Kodos debería ayudar a cualquier desarrollador a desarrollar expresiones regulares y sin esfuerzo en Python. Dado que la implementación de expresiones regulares de Python se basa en el estándar PCRE , Kodos debería beneficiar a los desarrolladores en otros lenguajes de programación que también cumplan con el estándar PCRE (Perl, PHP, etc.).

(...)

texto alternativo

Se ejecuta en Linux, Unix, Windows, Mac.


2
Kodos no proporciona verdaderas funciones de depuración. No puede pisar la expresión regular ni pausar la ejecución.
sincero

¿Algún consejo para que funcione en una Mac? El sitio de Sourceforge no ofrece ninguna información sobre la instalación para Mac, y mi Google-fu parece estar fallando.
Adam Parkin

¿Aunque parece ser Python2 y no se ha actualizado desde 2006 (hace 14 años al momento de escribir)?
MrWhite

13

Creo que no lo hacen. Si su expresión regular es demasiado complicada y problemática hasta el punto de que necesita un depurador, debe crear un analizador específico o utilizar otro método. Será mucho más fácil de leer y mantener.


44
Amigo, ¿publicaste esto después de mirar la captura de pantalla regexbuddy?
torre

2
Todos estarán en desacuerdo con esto, pero no es una mala idea. Todos asumen que el motor regex es más eficiente con enormes expresiones regulares. Esto no es necesariamente cierto, y definitivamente no son fáciles de leer. Rompe tus expresiones regulares.
Dan Rosenstark

1
@ Michael Brooks: No, antes, en realidad. Después de ver la captura de pantalla, estoy de acuerdo con el hecho de que PUEDE depurar una expresión regular. Pero mantengo mi idea: cuando una expresión regular se vuelve demasiado complicada, es hora de cambiar de otra manera.
Valentin Rocher

12

Existe una excelente herramienta gratuita, el Regex Coach . La última versión solo está disponible para Windows; su autor, el Dr. Edmund Weitz, dejó de mantener la versión de Linux porque muy pocas personas la descargaron, pero hay una versión anterior para Linux en la página de descarga.


8

Acabo de ver una presentación de Regexp :: Debugger por su creador: Damian Conway. Cosas muy impresionantes: ejecutar in situ o usar una herramienta de línea de comando (rxrx), interactivamente o en un archivo de ejecución "registrado" (almacenado en JSON), avanzar y retroceder en cualquier punto, detenerse en puntos de interrupción o eventos, salida en color (configurable por el usuario ), mapas de calor en expresiones regulares y cadenas para la optimización, etc.

Disponible en CPAN de forma gratuita: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


OP dijo "No puedo pasar por una expresión regular con un depurador".
Quantum

¿Tienes un enlace a la presentación?
torre

3
@Rook, puedes ver la presentación en youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

Depuro mis expresiones regulares con mis propios ojos. Es por eso que uso /xmodificador, escribo comentarios para ellos y los divido en partes. Lea las expresiones regulares de dominio de Jeffrey Friedl para aprender a desarrollar expresiones regulares rápidas y legibles. Varias herramientas de depuración de expresiones regulares solo provocan la programación de vudú.


5

En cuanto a mí, generalmente uso la utilidad pcretest que puede volcar el código de byte de cualquier expresión regular, y generalmente es mucho más fácil de leer (al menos para mí). Ejemplo:

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

Si me siento atrapado, me gusta ir hacia atrás y generar la expresión regular directamente de un texto de muestra usando txt2re (aunque generalmente termino ajustando la expresión regular resultante a mano).




2

Escribir registros usando una notación como PCRE es como escribir ensamblador: está bien si solo puedes ver los autómatas de estado finito correspondientes en tu cabeza, pero puede ser difícil de mantener muy rápidamente.

Las razones para no usar un depurador son muy similares a las de no usar un depurador con un lenguaje de programación: puede corregir errores locales, pero no lo ayudarán a resolver los problemas de diseño que lo llevaron a cometer los errores locales en un primer momento. sitio.

La forma más reflexiva es usar representaciones de datos para generar expresiones regulares en su lenguaje de programación, y tener abstracciones apropiadas para construirlas. La introducción de Olin Shiver a su notación regexp de esquema ofrece una excelente visión general de los problemas que se enfrentan al diseñar estas representaciones de datos.


Los combinadores de analizador son realmente una forma increíble de ir: Parsec y PArrows en Haskell, rsec en Ruby, Boost Spirit en C ++, PyParsing en Python, Perl6 :: Reglas en Perl, etc.
efímero

2

A menudo uso pcretest, apenas un "depurador", pero funciona a través de una conexión SSH de solo texto y analiza exactamente el dialecto regex que necesito: mi código (C ++) se vincula a libpcre, por lo que no hay dificultad con diferencias sutiles en lo que es mágico y qué no es, etc.

En general, estoy de acuerdo con el tipo de arriba para quien necesitar un depurador de expresiones regulares es un olor a código. Para mí, lo más difícil de usar expresiones regulares generalmente no es la expresión regular en sí misma, sino las múltiples capas de citas necesarias para que funcionen.





0

Para mí, después de haber analizado la expresión regular (ya que soy bastante fluido, y casi siempre uso / x o equivalente), podría depurar en lugar de probar si no estoy seguro de si llegaría a una coincidencia degenerada (es decir, algo que retrocede excesivamente) para ver si podía resolver tales problemas modificando la codicia de un operador, por ejemplo.

Para hacer eso, usaría uno de los métodos mencionados anteriormente: pcretest, RegexBuddy (si mi lugar de trabajo actual lo ha autorizado) o similar, y a veces lo cronometraré en Linqpad si estoy trabajando en expresiones regulares de C #.

(El truco perl es nuevo para mí, por lo que probablemente también lo agregue a mi kit de herramientas de expresiones regulares).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.