在字符串中查找并替换第n个出现的[括起来的]表达式

19

我有一个表单,其中 name 属性会被更新,但问题是我使用了多维值,如下所示:

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

我不是完全清楚你想做什么!使用你上面的例子,你能展示一下期望的输出吗? - Manse
欢迎来到StackOverflow。我发现这个问题没有得到很多浏览,所以我编辑了你的标题,以清楚地反映你正在问的问题——如何查找和替换括号中表达式的第n次出现。 - Vivian River
4个回答

46

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

下面的例子将用"M"替换"HELLO, WORLD"中的第二个"L"。

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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace


谢谢Daniel,这个完美地解决了我的问题。我不知道replace函数有一个回调函数。 - DJ Mosca
如果这个回答解决了你的问题,请点击旁边的复选标记将其标记为被接受的答案。 - Vivian River
3
太好了,这确实帮助了我很多,但我需要替换每个第n个字符。为了做到这一点,我用(nth % 2 === 0)替换了(nth === 2) - mikeybeck

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


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,用repl替换第n次出现的find

示例用法:

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"

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接