Debe utilizar un analizador cuando usted está interesado en el significado léxico o semántico del texto, cuando los patrones pueden variar. Los analizadores son generalmente exagerados cuando simplemente busca coincide o reemplaza patrones de caracteres, independientemente de su significado funcional.
En su caso, parece estar interesado en el significado detrás del texto ("componentes funcionales" del código), por lo que un analizador sería la mejor opción. Sin embargo, Parsers puede hacer uso interno de la expresión regular, por lo que no deben considerarse mutuamente excluyentes.
Un "analizador" no significa automáticamente que deba ser complicado, sin embargo. Por ejemplo, si está interesado en bloques de código C, simplemente podría analizar grupos anidados de {y}. Este analizador solo estaría interesado en dos tokens ('{' y '}') y los bloques de texto entre ellos.
Sin embargo, una comparación simple de expresiones regulares no es suficiente debido a la semántica anidada. Tome el siguiente código:
void Foo(bool Bar)
{
if(Bar)
{
f();
}
else
{
g();
}
}
Un analizador va a entender el alcance global de Foo, así como cada ámbito interno contenido dentro de Foo (los if y else bloques). Cuando encuentra cada '{' token, "entiende" su significado. Una búsqueda simple, sin embargo no entiende el significado detrás del texto y puede interpretar el siguiente para ser un bloque, que, por supuesto, sabemos que no es correcta:
{
if(Bar)
{
f();
}
No estoy seguro si es un duplicado, pero consulte las siguientes publicaciones: * [¿Cuándo es un problema demasiado complejo para una expresión regular?] (Http: // stackoverflow.com/questions/230517/when-is-a-problem-too-complex-for-a-regular-expression) * [Alternativas a expresiones regulares] (http://stackoverflow.com/questions/514313/alternatives-to -regular-expressions) – dirkgently