(?(DEFINE)...) y recursividad en expresión regular
Publicado: 2016-05-06 16:18 @721
Hola a todos nuevamente. Estoy tratando de capturar una serie de listas de un archivo latex, de la forma:
definidas por \begin{itemize}...\end{itemize} y dejarlas dentro de Corta ... Aqui. Como las marcas que busco pueden estar unas dentro de otras y, de ser así, siempre están balanceadas, he tratado de capturarlas con una expresión regular recursiva usando ?(DEFINE), pero, no logro dar con los cuantificadores correctos para los casos en los que aparecen estas listas.
Este es el código que he intentado:
Agradecido.
Pablo
Using latex Syntax Highlighting
- \begin{itemize}[algo]
- \item a
- \item b
- \item c
- \begin{itemize}
- \item d
- \item e
- \end{itemize}
- \item f
- \item g
- \end{itemize}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Este es el código que he intentado:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use v5.14;
- use autodie; # muere si ocurre un error
- use Data::Dumper;
- my $archivo = '
- Caso 1 (sin líneas en blanco)
- \begin{itemize}
- \item a
- \item b
- \item c
- \end{itemize}
- Caso 2 (con líneas en blanco)
- \begin{itemize}
- \item a
- \item b
- \item c
- \end{itemize}
- Caso 3
- \begin{itemize}
- \begin{itemize}
- \item a
- \item b
- \item c
- \end{itemize}
- \end{itemize}
- Caso 3a
- \begin{itemize}
- \begin{itemize}
- \item a
- \item b
- \item c
- \end{itemize}
- \end{itemize}
- Caso 4
- \begin{itemize}[algo]
- \item a
- \item b
- \item c
- \begin{itemize}
- \item d
- \item e
- \end{itemize}
- \item f
- \item g
- \end{itemize}
- Caso 5
- \begin{itemize}[algo]
- \item a
- \item b
- \item c
- \begin{itemize}
- \item d
- \item e
- \end{itemize}
- \item f
- \item g
- \end{itemize}
- ';
- # ExpReg pasada a /qr
- my $regex = qr/
- ((?&LISTA)) # captura
- (?(DEFINE) # Verbo que inicia la expresión regular
- (?<LISTA> # comenzamos con la búsqueda
- \\begin\{itemize\}\s* # inicio del bloque deseado
- .+?
- (?&ENVCODE)? # recursiva
- .+?
- \\end\{itemize\}(?:\s*)? # fin del bloque deseado
- ) # cierra LISTA
- (?<ENVCODE> (?:(?&LISTA)).+ ) # Aplicamos la recursividad
- )
- /mx;
- $archivo =~ s/($regex)/Corta\n($1)Aqui\n/gmsx;
- say "$1";
- __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Agradecido.
Pablo