O, con una expresión regular para tokenizing, y una pequeña máquina de estado que sólo se suma la tecla/val a un mapa:
String line = "a = b c='123 456' d=777 e = 'uij yyy'";
Map<String,String> keyval = new HashMap<String,String>();
String state = "key";
Matcher m = Pattern.compile("(=|'[^']*?'|[^\\s=]+)").matcher(line);
String key = null;
while (m.find()) {
String found = m.group();
if (state.equals("key")) {
if (found.equals("=") || found.startsWith("'"))
{ System.err.println ("ERROR"); }
else { key = found; state = "equals"; }
} else if (state.equals("equals")) {
if (! found.equals("=")) { System.err.println ("ERROR"); }
else { state = "value"; }
} else if (state.equals("value")) {
if (key == null) { System.err.println ("ERROR"); }
else {
if (found.startsWith("'"))
found = found.substring(1,found.length()-1);
keyval.put (key, found);
key = null;
state = "key";
}
}
}
if (! state.equals("key")) { System.err.println ("ERROR"); }
System.out.println ("map: " + keyval);
imprime
map: {d=777, e=uij yyy, c=123 456, a=b}
Hace alguna comprobación básica de errores y quita las cotizaciones de los valores.
¿No podría simplemente usar una expresión regular para dividir por espacios a menos que esté dentro de una cita (no es que yo sepa la expresión regular, pero estoy bastante seguro de que puede hacerlo). – mk12
Su código funciona perfectamente aquí usando jdk 1.6.0_13 –
@LePad arriba del código dará salida a * [a = b, c = '123, 456', d = 777, e = 'uij, yyy'] * –