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

时间:2019-07-05 08:19:01

标签: javascript jquery regex string regex-lookarounds

在表单中,我有一个动态表,可以在其中添加或删除每个单元格中带有字段的行。每次我添加/删除一行时,它都会更新每个name的{​​{1}}。

名称如下:<input />

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

我找到了正确的正则表达式来做到这一点:

[0]

但是我也有更复杂的输入名称,例如:var name = $(input).attr('name'); var str = name.replace(/\[\d+\]/, '[' + index + ']');

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

sheet[cci][0][terms][0][commit]

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

在字符串末尾前对[\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)始终包含< em> no 数字,您可以将其简化为\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 + ']')
  )
});