匹配方括号中最后一次出现的数字的 JS 正则表达式

JS regex that matches the last occurrence of a number in square brackets

在一个表单中,我有一个动态的 table,我可以在其中添加或删除每个单元格中包含字段的行。每次我 add/delete 一行,它都会更新每个 <input />name

名字是这样的:sheet[discounts][0][base]

我只想更改此字符串的 [0](不是完全匹配,而是方括号中的数字)。

我找到了正确的正则表达式:

var name = $(input).attr('name');
var str = name.replace(/\[\d+\]/, '[' + index + ']');

但我也有更复杂的输入名称,例如:sheet[cci][0][terms][0][commit]

我只想更改 方括号中数字的最后一次出现 :

// replace this
sheet[cci][0][terms][0][commit]

// by this
sheet[cci][0][terms][1][commit]

字符串结尾前 [\d+] 的否定前瞻:

const index = 7;
`sheet[cci][0][terms][1][commit]
sheet[cci][0][terms][2][commit]
sheet[cci][0][terms][3][commit]`.split('\n').forEach((str) => {
  console.log(
    str.replace(/\[\d+\](?!.*\[\d+\])/, '[' + index + ']')
  )
});

如果方括号中的项目 不是 纯数字(如示例中的 ccitermscommit text) 总是包含 no 数字,你可以将它简化为 lookahead for \D*$ (lookahead for non-digit characters, followed by the end of the string):

const index = 7;
`sheet[cci][0][terms][1][commit]
sheet[cci][0][terms][2][commit]
sheet[cci][0][terms][3][commit]`.split('\n').forEach((str) => {
  console.log(
    str.replace(/\[\d+\](?=\D*$)/, '[' + index + ']')
  )
});

使用一个贪婪的点来消耗(并匹配)所有东西直到最后一个 [0]:

var name = 'sheet[cci][0][terms][0][commit]';
var index = 3;
var str = name.replace(/(.*)\[\d+\]/, '[' + index + ']');
console.log(str);

此处的替换逻辑是将 [index] 替换放在包含第 t 个输入第一部分的第一个捕获组之后。