Si la cadena tiene muchas entradas que puede ser mejor análisis sintáctico manualmente sin StringTokenizer para ahorrar algo de memoria (en caso de tener que analizar miles de estas cadenas, vale la pena el código adicional):
public static Map parse(String s) {
HashMap map = new HashMap();
s = s.substring(1, s.length() - 1).trim(); //get rid of the brackets
int kpos = 0; //the starting position of the key
int eqpos = s.indexOf('='); //the position of the key/value separator
boolean more = eqpos > 0;
while (more) {
int cmpos = s.indexOf(',', eqpos + 1); //position of the entry separator
String key = s.substring(kpos, eqpos).trim();
if (cmpos > 0) {
map.put(key, s.substring(eqpos + 1, cmpos).trim());
eqpos = s.indexOf('=', cmpos + 1);
more = eqpos > 0;
if (more) {
kpos = cmpos + 1;
}
} else {
map.put(key, s.substring(eqpos + 1).trim());
more = false;
}
}
return map;
}
Probé este código con estas cadenas y trabaja muy bien:
{k1 = v1}
{k1 = v1, k2 = v2, k3 = v3, k4 = v4}
{k1 = v1,}
Mi biblioteca de análisis sintáctico que quiere decir la expresión regular, o ningún tercero ¿biblioteca? – Yishai
¿Puede v1, v2 ... contener '=' o ','? – sinuhepop
Supongamos que los valores no contienen '=' o ','. Simplemente no hay libs de terceros. – tinkertime