17

我有一个名称属性得到更新的表单,但问题是我使用多维值,如下所示:

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

4 回答 4

45

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

以下示例将“HELLO, WORLD”中的第二个“L”替换为“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!";

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

于 2012-05-14T14:23:11.850 回答
2

接受的答案中给出的方法简洁而可靠,但它有一个缺点:如果有一个大字符串,并且给定子字符串的外观很多,它将被扫描到最后 - 即使只需要在开始。另一种方法是使用“exec”,然后在替换完成后立即断开链:

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

于 2017-10-17T12:58:50.027 回答
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/

于 2012-05-14T14:11:12.700 回答
0

简短,这就是我用于“查找第 n 个并替换”的内容:

function replNth(str,n,find,repl){var A=str.split(find);return A.slice(0,n).join(find)+repl+A.slice(n).join(find)}

返回str,将第nth 次出现find替换为repl

示例用法:

var str='M1,2C3,4 5,6 7,8 9,10 11,12',
    newStr=replNth( str, 3, ' ', 'S' );
console.log( newStr ); / / "M1,2C3,4 5,6 7,8S9,10 11,12"
于 2021-09-22T04:23:02.060 回答