¿Cómo puedo eliminar la captura de subgrupos anidados arbitrariamente en una cadena de expresiones regulares Perl? Me gustaría anidar cualquier expresión regular en una expresión envolvente que capture la subregex como una entidad completa, así como los grupos posteriores conocidos estáticamente. ¿Debo transformar manualmente la cadena de expresiones regulares en todos los grupos de (?:)
que no se están capturando (y espero que no me equivoque), o existe un mecanismo de biblioteca o regex de Perl que proporcione esto?¿Cómo puedo hacer que una Perl regex arbitraria no sea capturada por completo? (Respuesta: No se puede)
# How do I 'flatten' $regex to protect $2 and $3?
# Searching 'ABCfooDE' for 'foo' OK, but '((B|(C))fo(o)?(?:D|d)?)', etc., breaks.
# I.E., how would I turn it effectively into '(?:(?:B|(?:C))fo(?:o)?(?:D|d)?)'?
sub check {
my($line, $regex) = @_;
if ($line =~ /(^.*)($regex)(.*$)/) {
print "<", $1, "><", $2, "><", $3, ">\n";
}
}
Adición: soy vagamente consciente de $&
, $`
, y $'
y han aconsejado a evitarlos si es posible, y no tienen acceso a ${^PREMATCH}
, ${^MATCH}
y ${^POSTMATCH}
en mi entorno Perl 5.8 . El ejemplo anterior se puede dividir en 2/3 fragmentos utilizando métodos como estos, y casos reales más complejos podrían iterar esto manualmente, pero creo que me gustaría una solución general, si es posible.
respuesta aceptado: lo que deseo existía y sorprendente (al menos para mí) no lo hace, es un grupo de encapsulación que hace que su contenido opaco, de tal manera que backreferences posicionales subsiguientes ver el contenido como una sola entidad y nombres de referencias son sin alcance gbacon tiene una solución potencialmente útil para Perl 5.10+, y FM muestra un mecanismo iterativo manual para cualquier versión que puede lograr el mismo efecto en casos específicos, pero j_random_hacker lo llama que no hay un mecanismo de lenguaje real para encapsular subexpresiones.
+1 Buen trabajo con las ediciones de seguimiento. – FMc