2011-07-19 23 views
5

Necesito una expresión regular para analizar los pares clave-valor de un archivo de propiedades para escribirlos en una base de datos. La aplicación está escrita en java. Como necesito almacenar información sobre líneas de comentario y líneas vacías, properties.load no funciona para míRegex para pares clave-valor, incluidos los espacios en blanco sin espacios

La clave lo es todo hasta la primera aparición de un espacio en blanco sin espacios o un signo igual (incluidos los espacios en blanco escapados). El valor lo es todo hasta el final de la línea, pero también puede estar vacío.

Tiene que coincidir los siguientes casos:

clave
  • = valor
  • valor clave
  • valor de clave = valor
  • clave
  • valor de la clave de valor
  • clave tecla \ \ clave = valor
  • clave \ clave \ valor clave

He intentado lo siguiente expresión regular, pero no separados los dos últimos casos correctamente:

^(\\\s|[^\s=]+)+[\s|=](.*)?$ 

Para los dos últimos ejemplos que recibo en Rubular:

1. key\ 
2. key\ key value 

en lugar de

1. key\ key\ key 
2. value 

También probé this, pero a mí tampoco me sirve

Gracias de antemano por ayuda!

Respuesta

2

que desea utilizar una búsqueda hacia atrás negativo (?<!\\\\)\s al comprobar su espacio

^((.*?)((?<!\\\\)\\s|=)(.*?)|(\\w+))$ 

Rompiendo con las

(.*?)    Match everything non greedy up to the next match 
((?<!\\\\)\\s|=) Match witespace not preceded by \\ 
(.*?)    Again match everything non greedy up to the next match 
|\\w+    Or match strings with no whitespace - this captures case 3 with no value 

Cada caso de prueba con la herramienta aquí http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

+0

Parece que funciona bien. ¡Gracias por ayuda y explicación! :) – Sebastian

+1

También podría usar '(. *?) (((?

+0

@ Dan-Cruz Simplificación muy agradable: debería agregarla como su propia respuesta y obtener algo de crédito por ello. – cordsen

0

intento (recordar que se trata de expresiones regulares sin formato, así que hay que tener cuidado con las barras invertidas escapar al escribir como cadenas de Java):

^(\\\s|[^\s=])+(.*)$ 
+0

Esta expresión regular solo captura el último carácter de la clave. – Sebastian

+0

Olvidó un par de barras inclinadas: '^ (\\\\\ s | ....)'. –

+0

@Sebastian: bien, lo siento, no tengo herramientas para probar aquí, solo uso mi cerebro :) – LeleDumbo

Cuestiones relacionadas