2012-05-14 12 views
9

Ich habe ein Formular ersetzen, wo die Namen Attribute bekommen aktualisiert, aber das Problem ist im mit mehrdimensionalen Werte wie folgt:Suchen und n-te Auftreten von [klammert] Ausdruck in String

<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... 

Ich brauche zu ändern . der Wert innerhalb der eckigen Klammern mit JavaScript nicht Ganz gleich, welche Position sie sind in ich habe versucht, den folgenden regulären Ausdruck unter Verwendung des Wertes zwischen den eckigen Klammern entsprechen:

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

aber dies entspricht allen Vorkommen, und was ich tun muss, ist irgendwie das n-te Vorkommen zu finden und zu ersetzen.

Oder wenn es eine andere Möglichkeit gibt, die Werte in den eckigen Klammern zu finden und zu ersetzen, ohne reguläre Ausdrücke zu verwenden, bin ich ganz Ohr.

Vielen Dank im Voraus

Gelöst

Dieser letzte Code ist wie folgt:

$('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 nicht ganz klar, was Ihr zu tun versuchen! Mit dem obigen Beispiel können Sie die erwartete Ausgabe anzeigen ... – ManseUK

+0

Willkommen bei StackOverflow. Ich sehe, dass diese Frage nicht sehr viele Ansichten bekommt, daher habe ich Ihren Titel so bearbeitet, dass er die Frage, die Sie stellen, klar widerspiegelt - wie man das n-te Vorkommen eines Ausdrucks in Klammern findet und ersetzt. –

Antwort

32

Hier ist eine andere mögliche Lösung. Sie können der Funktion string.replace eine Funktion übergeben, um zu ermitteln, wie der Ersatzwert sein soll. Die Funktion wird drei Argumente übergeben. Das erste Argument ist der übereinstimmende Text, das zweite Argument ist die Position innerhalb der ursprünglichen Zeichenfolge und das dritte Argument ist die ursprüngliche Zeichenfolge.

Das folgende Beispiel ersetzt das zweite "L" in "HELLO, WORLD" durch "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!"; 

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

+0

Danke Daniel, das hat perfekt funktioniert. Ich wusste nicht, dass die Replace-Funktion eine Callback-Funktion hatte. –

+0

Wenn dies Ihre Frage beantwortet hat, klicken Sie bitte auf das Häkchen neben dieser Antwort, um es als akzeptierte Antwort zu markieren. –

+0

Genau das, was ich brauchte, danke! – SpartaSixZero

0

Wenn ich die Frage richtig die RegExp unten tun sollten verstehen:

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 hier: http://jsfiddle.net/EUcdX/

0

Der Ansatz in der akzeptierten Antwort gegeben ist prägnant und solide, aber es hat einen Nachteil: Wenn es mit einer Menge von Auftritten des gegebenen Teilkette eine große Zeichenfolge ist, wird es bis zum Ende gescannt werden - auch wenn man nur am Anfang ersetzen muss. Die Alternative wäre ‚exec‘ verwenden, dann die Kette abbrach direkt nach dem Austausch erfolgt:

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));

Verwandte Themen