2012-09-25 30 views
11

necesito analizar un archivo de registro y obtener los tiempos y la cadena de llamada de función asociada Esto se almacena en el archivo de registro como tal: {"tiempo": "2012-09-24T03: 08: 50 "," mensaje ":" Call() started "}

Habrá varias llamadas a funciones de tiempo registradas entre otros caracteres de cadena, por lo tanto, espero usar regex para recorrer el archivo y tomar todas estas

me gustaría agarrar toda la información registrada incluyendo las llaves

he intentado el siguiente

Pattern logEntry = Pattern.compile("{(.*?)}"); 
Matcher matchPattern = logEntry.matcher(file); 

y

Pattern.compile("{[^{}]*}"); 
Matcher matchPattern = logEntry.matcher(file); 

sigo obteniendo errores de repetición ilegales, por favor ayuda! Gracias.

Respuesta

25

tiene que escapar '{' & '}' con un '\'

manera: "{(.*?)}" se convierte en: "\\{(.*?)\\}"

donde tienes que escapar de la '\' con otro '\' primera

véase: http://www.regular-expressions.info/reference.html para obtener una lista completa de caracteres que necesitan escapar ...

+0

¡Esto funcionó! Gracias. Traté de escapar y siempre obtenía un error de compilación, solo estaba usando una barra invertida. ¿Cuál es el motivo de la doble barra invertida? Este es el error original: Secuencia de escape inválida (las válidas son \ b \ t \ n \ f \ r \ "\ '\\) –

+0

porque está escapando del carácter de escape para que se alimente en el compilador de expresiones regulares, por ejemplo: '\ n' == nueva línea, '\\' == \ character, y el compilador de expresiones regulares necesita ver que dado que los regex no son ciudadanos de primera clase en Java (están en otros idiomas como javascript), se compilan en runtime, no compile time ... – ckozl

+0

Ok, veo lo que dice en el momento de la compilación java piensa que es solo una cadena por lo tanto "\\" para obtener "\", y luego en tiempo de ejecución usa esa "\" en el Regex. Gracias por toda la ayuda. –

7

Braces son caracteres especiales de expresiones regulares utilizados para grupos de repetición, por lo tanto debe escapar de ellos.

Pattern logEntry = Pattern.compile("\\{(.*?)\\}"); 

probador simple:

public static void main(String[] args) throws Exception { 
     String x = "{\"time\" : \"2012-09-24T03:08:50\", \"message\" : \"Call() started\"}"; 
     Pattern logEntry = Pattern.compile("\\{(.*?)\\}"); 
     Matcher matchPattern = logEntry.matcher(x); 

     while(matchPattern.find()) { 
      System.out.println(matchPattern.group(1)); 
     } 

    } 

me da:

"time" : "2012-09-24T03:08:50", "message" : "Call() started" 
0

{} en la expresión regular tienen un significado especial, por lo necesitan ser escapados.

Por lo general, el escape se logra precediendo al personaje que se escapó con una barra diagonal inversa. En una clase de caracteres definido con corchetes, que no es necesario hacer esto

así que algo como

Pattern.compile("\{[^{}]*\}"); 

Podría estar más cerca de lo que quiere hacer

+2

Debes escapar del 'slash' ya que es un personaje especial de Java – gtgaxiola

3

se debe utilizar una búsqueda positiva hacia delante y la búsqueda hacia atrás: (? = {<)

(?<=\{)([^\}]+)(?=\}) 
  • corresponder todo seguido de {
  • ([^}] +) Coincide con cualquier cadena que no contenga}
  • (?= {) Coincide con todo antes de {
0

Esto funciona perfectamente para soportes no anidados pero por expresiones como

(sum(x) * 100)/(sum(y) + sum(z))

[a-z]*[\{]+([a-zA-Z0-9]+)[\}]+ obras.

Cuestiones relacionadas