Discusión de Java Regexp

Tengo este texto que se ve así:

executeRule(document, 'SendEmail', [
    'emailAddress':'EMAIL(john@yahoo.com)',
    'subject':'Test',
    'text':'Test',
    'defaultText':'Test']
);

Necesito analizarlo con una expresión regular para obtener los parámetros de executeRule.

Actualmente mi expresión regular se ve así (java):

List<String> partialRules = new ArrayList<String>();
        List<String> rules = new ArrayList<String>();
        Pattern p = Pattern.compile("executeRule\\(\\s*\\w+,\\s*'(\\w+)'\\s*,\\.*");

El problema es que no puedo encontrar una expresión regular que coincida con mi tercer parámetro del método executeRule.

Cualquier ayuda se agradece.

Gracias por su atención.

preguntado el 08 de noviembre de 11 a las 11:11

2 Respuestas

¿Ha pensado en no usar una expresión regular para hacer todo lo anterior, sino escribir un analizador simple para dividirlo en comas y luego delegar en otro analizador para analizar cada par delimitado por dos puntos? Puede ser más fácil de construir / depurar (dependiendo de si permite comas dentro de cada cadena de texto, por supuesto).

Si elige expandir su sintaxis anterior, entonces esto puede ser más extensible que una expresión regular (posiblemente considerable).

respondido 08 nov., 11:15

¡Absolutamente! Como sabe que tendrá exactamente x argumentos y estarán separados por comas y no debería haber comas en los argumentos, esto parece una solución realmente agradable en lugar de una expresión regular demasiado compleja. - John B

El método executeRule puede ocurrir más de una vez en mi texto y entre estos métodos executeRule puede haber texto no relacionado (por ejemplo, text text executeRule (X, Y, Z); text text executeRule (X, Y, Z); - Sergiu

una de mis citas favoritas: algunas personas, cuando se enfrentan a un problema, piensan "Lo sé, usaré expresiones regulares". Ahora ellos tienen dos problemas. - dapeng

Pattern p = Pattern.compile("(?s)executeRule\\(\\s*?(.+?),\\s*?('.+?'),\\s*(\\[.+?\\])");

Si entiendo bien lo que quieres. Cada argumento se guardará en el grupo (i) de Matcher.

respondido 08 nov., 11:15

No puede usar la división por comas, porque el tercer argumento contiene su. - Zernike

¿Cómo puedo capturar incluso el; al final del método? A partir de ahora, coincido con todo el método excepto el final; . Gracias - Sergiu

Si entiendo bien, desea obtener el método completo, no solo los argumentos. Pruebe dicho código Pattern p = Pattern.compile ("(? S) executeRule \ (\\ s *? (. +?), \\ s *? ('. +?'), \\ s * (\ [. +? \] \\ s \);) "); - Zernike

El patrón no parece compilarse para obtener todo mi método :( - Sergiu

Fue mi error. Olvidé escapar de todas las barras. Pattern.compile ("(? S) executeRule \ (\\ s *? (. +?), \\ s *? ('. +?'), \\ s * (\ [. +? \] \\ s\);)"); Hm ... no es mi error, error del analizador de mensajes. Compruebe todas las barras. No sé cómo se oye escribir una cadena cruda. Eliminar [^ \\.] Antes (? S). (? s) es una bandera para incluir espacios en blanco en el punto y no debe haber nada antes. - Zernike

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.