2010-09-09 17 views

Respuesta

11

por lo general uso el método de "search and don't replace":

var ret = {}, 
    str = "param1:'test1' && param2:'test2'"; 

str.replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) { 
    ret[param] = value; 
}); 

JSON.stringify(ret); 
// -> { "param1": "test1", "param2":"test2" } 

Ejemplo: http://jsfiddle.net/bcJ9s/

+1

+1: Esto es un poco más robusto que mi sugerencia. Aún podría mejorarse; si hay un espacio entre el identificador y los dos puntos, se incluye en el identificador. :) – Guffa

+0

Lo importante, aquí, es si puede predecir el formato de las 'cuerdas' por adelantado, para hacer que la expresión regular sea lo más simple posible. Esto ayudará con el mantenimiento, en el futuro, pero probablemente debería estar bien documentado en alguna parte, de modo que quede claro cuáles son las suposiciones. – belugabob

4

Mientras está en ese formato, es decir, sólo tiene valores de cadena (y las cuerdas no contienen " && " o dos puntos), puede analizar fácilmente:

var params = theString.split(' && '); 
var map = {}; 
for (var i = 0; i < params.length; i++) { 
    var parts = params[i].split(':'); 
    map[parts[0]] = parts[1].substr(1, parts[1].length - 2); 
} 

Tenga en cuenta que las cadenas son, por supuesto, todavía cadenas: { param: 'test1', param2: 'test2' }

1

procesamiento Usar cadena (como se mencionó por @Guffa, se producirá un error si mismos contenían cadenas && o :):

var str="param1:'test1' && param2:'test2'"; 
var map={}; 
var pairs=str.split('&&'); 
for(i=0, total=pairs.length; i<total; i++) { 
    var pair=pairs[i].trim().split(':'); 
    map[pair[0]]=pair[1].substr(1, pair[1].length-2); 
} 

Nota: trim() no está disponible en los navegadores antiguos, es necesario añadir este fragmento de código antes de la anterior [src]:

if (!String.prototype.trim) { 
    String.prototype.trim = function() { 
     return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, "$1"); 
    }; 
} 
+0

Aunque falla con valores como '" param1: 'prueba: 1' && param2: 'prueba && 2' "' ... – Guffa

+0

Tienes razón, pensé en eso pero leí lo que dijiste antes de tu respuesta, así que pensé en alguien Si no me refiero a esto, no tengo que hacerlo, pero probablemente debería editar refiriéndome a esto también, gracias. – aularon

1

utilizar la función string.split para romper la cadena en las partes que necesita - algo como esto ...

var input = "param1:'test1' && param2:'test2'"; 
var entries = input.split(" && "); 
var map = {}; 
var pattern = /'/g; 
for(var i=0; i < entries.length; i++){ 
    var tokens = entries[i].split[":"]; 
    map[tokens[0]] = tokens[1].replace(pattern, ""); 
} 
+0

Es bastante satisfactorio ver que otras personas han llegado a casi la misma solución, necesitan pasar un tiempo entendiendo la respuesta proporcionada por Andy E, ya que nunca he visto string.replac usado con una función como el segundo parámetro. Quizás Andy E podría expandir su respuesta en beneficio de otros como yo. – belugabob

+0

Aunque falla con valores como '" param1: 'test: 1' && param2: 'test && 2' "' ... – Guffa

+0

es muy parecido a un regex * exec() *, excepto que no hay ningún bucle y estás nombrando las sub-capturas en su propio cierre privado. Es por eso que he vinculado al artículo donde John Resig acuñó el término y explicó el método :-) –

Cuestiones relacionadas