Pregunta

He estado tratando de encontrar una expresión regular que me permita buscar una cadena en particular mientras omito los comentarios automáticamente.¿Alguien tiene un RE como este o conoce alguno?Ni siquiera necesita ser lo suficientemente sofisticado como para saltarse #if 0 bloques;Sólo quiero que se salte // y /* bloques.Lo contrario, es decir, buscar únicamente dentro de los bloques de comentarios, también sería muy útil.

Ambiente:contra 2003

¿Fue útil?

Solución

Este es un problema más difícil de lo que podría parecer a primera vista, ya que es necesario considerar tokens de comentarios dentro de cadenas, tokens de comentarios que a su vez están comentados, etc.

Escribí un analizador de cadenas y comentarios para C#, déjame ver si puedo encontrar algo que ayude...Actualizaré si encuentro algo.

EDITAR:...Bien, encontré mi antiguo proyecto 'codemasker'.Resulta que hice esto por etapas, no con una sola expresión regular.Básicamente, reviso un archivo fuente en busca de tokens de inicio, cuando encuentro uno, busco un token final y enmascaro todo lo que hay en el medio.Esto tiene en cuenta el contexto del token de inicio...Si encuentra un token para el "inicio de cadena", puede ignorar con seguridad los tokens de comentario hasta que encuentre el final de la cadena, y viceversa.Una vez que el código está enmascarado (usé guías como máscaras y una tabla hash para realizar un seguimiento), puede realizar la búsqueda y reemplazar de forma segura y, finalmente, restaurar el código enmascarado.

Espero que ayude.

Otros consejos

Tenga especial cuidado con las cuerdas.Las cadenas a menudo tienen secuencias de escape que también debes respetar mientras encuentras el final de ellas.

Entonces, por ejemplo. "This is \"a test\"".No se puede buscar ciegamente una comilla doble para terminar.También tenga cuidado con ``"Esto es \"`, que muestra que no se puede decir simplemente "a menos que las comillas dobles estén precedidas por una barra invertida".

En resumen, ¡haz unas pruebas unitarias brutales!

Una expresión regular no es la mejor herramienta para el trabajo.

Preguntas frecuentes sobre Perl:

C comenta:

#!/usr/bin/perl
$/ = undef;
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print; 

Comentarios de C++:

#!/usr/local/bin/perl
$/ = undef;
$_ = <>;

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;

Primero haría una copia y eliminaría los comentarios, luego buscaría la cadena de la forma habitual.

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