Pregunta

Estoy trabajando en un preprocesador que está analizando una conexión DSL. Mi objetivo es eliminar los comentarios. La instalación de bloque de comentario está demarcada por %% antes y después. No tienen que preocuparse por %% estar en cadenas, por la definición de la lengua.

Estoy utilizando esta expresión regular s///. Por desgracia, parece coincidir con todo y limpiarlo hacia fuera:

#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

La primera cosa que puede hacer es asegurarse de que no expansivo:

.*?

lo contrario,

  

%% %% un texto

     

contenido real

     

%% %% otro texto

todos serán eliminados.

Otros consejos

perlfaq6: ¿Qué significa que las expresiones regulares son codiciosos? ¿Cómo puedo conseguir alrededor de él?


La mayoría de la gente quiere decir que evitamos codiciosos coinciden tanto como les sea posible. técnicamente hablando, en realidad es que los cuantificadores son codiciosos en lugar de todo el patrón (, *, +, {}?); Perl prefiere avaricia local y la satisfacción inmediata a la codicia global. Para obtener versiones no codiciosos de los mismos cuantificadores, utilice (??, * + ?, ?, {}?).

Un ejemplo:

$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //;      # I am cold
$s2 =~ s/ve.*?y //;     # I am very cold

Observe cómo la segunda sustitución detuvo a juego tan pronto como se encontró con "y". Los *? cuantificador dice efectivamente el motor de expresiones regulares para encontrar una coincidencia lo más rápido posible y pasar el control a todo lo que es el siguiente en línea, al igual que lo haría si estuviera jugando patata caliente.

asumiendo que ha leído el código entero en el $ cadena variable y entre %% %% y no hay posibilidad de un solo occuring%, podría utilizar esto.

$ str = ~ s / %% ([^%] +) %% // g;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top