Pregunta

Considere siguiente script (que es absurdo total en pseudo-lenguaje):

if (Request.hostMatch("asfasfasf.com") && someString.existsIn(new String[] {"brr", "hrr"}))   {
    if (Requqest.clientIp("10.0.x.x")) {
        somevar = "1";
    }
    somevar = "2";
}
else {
    somevar = "first";
}
string foo = "foo";
// etc. etc.

¿Cómo agarrar bloque if parámetros y contenidos de ella es? El bloque if tiene formato de:

if<whitespace>(<parameters>)<whitespace>{<contents>}<anything>

He intentado utilizar String.split() con patrón de expresión de ^if\s*\(|\)\s*\{|\}\s* pero esto falla estrepitosamente. Es decir, el problema es que ) { se encuentra también en interior si-bloque y el } de cierre se encuentra en muchos lugares también. No creo que ninguno de expansión perezoso o ansiosos trabaja aquí.

Así que ... cualquier punteros a lo que podría necesitar aquí con el fin de poner en práctica esto con expresiones regulares?

También tiene que conseguir el resto del hilo sin el código del bloque if (lo que el código a partir de else { ...). Utilizando sólo String.split() parece hacer que sea difícil ya que no hay información sobre la longitud de las piezas que se analiza de distancia.

Al principio me creé una solución basada en bucle (usando String.substring() en gran medida) para esto, pero es aburrido. Me gustaría tener algo más elaborado en su lugar. ¿Debo ir con expresiones regulares o crear una costumbre, función genérica (hay muchos otros casos que sólo esto) que toma la cadena analizable y el patrón de cambio (tener en cuenta el patrón if<whitespace>(... arriba)?

Editar :. Retornos cambiado a las asignaciones de variables, ya que no habrían tenido sentido de lo contrario

¿Fue útil?

Solución

Un lenguaje regular no funcionará porque un regular de la gramática puede no coincidir con cosas como " cualquier número de paréntesis de apertura seguida por cualquier número de paréntesis de cierre". Un gramática independiente del contexto sería necesario para que .

A menos que utilice un libre de contexto analizador gramatical para Java o una extensión de la expresión regular que < a href = "http://www.truerwords.net/5711" rel = "nofollow"> hace expresiones regulares ya no regular, su solución basada en bucle es probablemente la solución más elegante.

Otros consejos

Sería mucho mejor de usar (o escribir) un analizador de tratar de hacer esto con expresiones regulares.

Regex es muy bueno para algunas cosas, pero para el análisis complejo como este, es una mierda. Otro ejemplo en el que se aspira que obtiene preguntó mucho aquí es análisis de HTML -. Lo puede hacer en un grado limitado, pero para nada compleja, un analizador DOM es una solución mucho mejor

Para una [muy] analizador simple, lo que necesita es una función recursiva que las búsquedas de unas llaves { y }, de manera recursiva hasta un nivel cada vez que se encuentra con una llave de apertura, y una copia de seguridad a nivel de regresar cuando encuentra una llave de cierre. A continuación, necesita almacenar los contenidos de la cadena entre los dos apoyos en cada nivel.

De acuerdo con lo anterior, se necesita un analizador. Un tipo que es fácil de poner en práctica (y divertido de escribir!) Es un recursiva descenso analizador con backtracking . También hay una gran cantidad de generadores de analizadores sintácticos por ahí, aunque la mayoría de las personas tienen una curva de aprendizaje. Un generador de análisis de Java-amigable es JavaCC .

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