2012-05-14 9 views
9

Tengo un formulario en el que los atributos nombre se actualizan, pero el problema es im utilizando valores multidimensionales de la siguiente manera:Buscar y reemplazar enésima aparición de la expresión [entre corchetes] en la cadena

<input type="text" name="questions[0][question]" /> 
<input type="text" name="questions[0][order]" /> 
<input type="text" name="questions[0][active]" /> 
<input type="text" name="answers[0][1][answer]" /> 
<input type="text" name="answers[0][2][answer]" /> 
<input type="text" name="answers[0][3][answer]" /> 

<input type="text" name="questions[1][question]" /> 
<input type="text" name="questions[1][order]" /> 
<input type="text" name="questions[1][active]" /> 
etc... 

tengo que cambiar . el valor dentro de los corchetes con JavaScript sin importar la posición que están en he intentado usar la siguiente expresión regular para que coincida con el valor entre los corchetes:

/(?<=\[)[^\]]*(?=\])/g 

pero esto coincide con todas las ocurrencias, y lo que tengo que hacer es de alguna manera encontrar y reemplazar la enésima ocurrencia.

O si hay otra forma de encontrar y reemplazar los valores dentro de los corchetes sin usar expresiones regulares, soy todo oídos.

Gracias de antemano

Resueltas

Este código final es la siguiente:

$('input', this).each(function(){ 
    var name = $(this).attr('name'); 
    var i = 0; 
    $(this).attr('name', name.replace(/\[.+?\]/g,function (match, pos, original) { 
    i++; 
    return (i == 1) ? "[THE REPLACED VALUE]" : match; 
    })); 
}); 
+0

Im no del todo claro en lo que estás tratando de hacer! usando su ejemplo anterior puede mostrar la salida esperada ... – ManseUK

+0

Bienvenido a StackOverflow. Veo que esta pregunta no está recibiendo muchos puntos de vista, por lo que he editado su título para reflejar claramente la pregunta que está haciendo: cómo encontrar y reemplazar la enésima aparición de una expresión entre corchetes. –

Respuesta

32

Aquí hay otra posible solución. Puede pasar una función a la función string.replace para determinar cuál debe ser el valor de reemplazo. La función se aprobará tres argumentos. El primer argumento es el texto coincidente, el segundo argumento es la posición dentro de la cadena original, y el tercer argumento es la cadena original.

El siguiente ejemplo reemplazará la segunda "L" en "HOLA, MUNDO" con "M".

var s = "HELLO, WORLD!"; 
var nth = 0; 
s = s.replace(/L/g, function (match, i, original) { 
    nth++; 
    return (nth === 2) ? "M" : match; 
}); 
alert(s); // "HELMO, WORLD!"; 

Ver MDN: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace

+0

Gracias Daniel, esto funcionó a la perfección. No sabía que la función de reemplazo tenía una función de devolución de llamada. –

+0

Si esto responde su pregunta, haga clic en la marca de verificación junto a esta respuesta para marcarla como la respuesta aceptada. –

+0

¡Justo lo que necesitaba, gracias! – SpartaSixZero

0

Si entiendo la pregunta correctamente la expresión regular se muestra a continuación debe hacer:

var patt = /<input.*?(\[(\d)\])(\[(\d)\]){0,1}.*/g 
var res = patt.exec(' <input type="text" name="questions[0][1][question]" />'); 

alert('First number: ' + res[2] + "\nSecond number: " + res[4]); 

Demo aquí: http://jsfiddle.net/EUcdX/

0

El enfoque dado en la respuesta aceptada es conciso y sólido, pero tiene un inconveniente: si hay una gran cadena con una gran cantidad de apariciones de la subcadena dados, ser escaneado hasta el final, incluso si solo tiene que reemplazarlo al principio. La alternativa sería el uso de 'exec', entonces la ruptura de la cadena justo después se realiza la sustitución:

function replaceNthOccurence(source, pattern, replacement, n) { 
 
    var substr = ''; 
 
    while (substr = pattern.exec(source)) { 
 
    if (--n === 0) { 
 
     source = source.slice(0, substr.index) + replacement + source.slice(pattern.lastIndex); 
 
     break; 
 
    } 
 
    } 
 
    return source; 
 
} 
 

 
console.log(replaceNthOccurence('bla_111_bla_222_bla_333', /\d+/g, '1st', 1)); 
 
console.log(replaceNthOccurence('bla_111_bla_222_bla_333', /\d+/g, '2nd', 2)); 
 
console.log(replaceNthOccurence('bla_111_bla_222_bla_333', /\d+/g, '3rd', 3));

Cuestiones relacionadas