在string中查找并替换第n次出现的[bracketed]表达式

时间:2012-05-14 13:55:31

标签: javascript jquery html regex 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...

我需要使用JavaScript更改方括号内的值,而不是在什么位置。 我尝试使用以下正则表达式来匹配方括号之间的值:

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

但是这匹配所有匹配项,我需要做的是以某种方式找到并替换第n次出现。

或者,如果有另一种方法可以在不使用正则表达式的情况下查找和替换方括号内的值,我就是耳朵。

提前致谢

解决

最终代码如下:

$('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;
    }));
});

3 个答案:

答案 0 :(得分:34)

这是另一种可能的解决方案。您可以将string.replace函数传递给函数以确定替换值应该是什么。该函数将传递三个参数。第一个参数是匹配文本,第二个参数是原始字符串中的位置,第三个参数是原始字符串。

以下示例将替换第二个&#34; L&#34; in&#34; HELLO,WORLD&#34;用&#34; M&#34;。

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!";

请参阅MDN:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace

答案 1 :(得分:2)

在接受的答案中给出的方法简洁明了,但它有一个缺点:如果有一个大字符串,其中有很多外观的给定子字符串,它将被扫描到最后 - 即使一个必须在开始时更换。替代方案是使用&#39; exec&#39;,然后在更换完成后立即断开链条:

&#13;
&#13;
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) );
&#13;
&#13;
&#13;

答案 2 :(得分:0)

如果我理解正确的问题,下面显示的RegExp应该:

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

在这里演示:http://jsfiddle.net/EUcdX/