使用javascript replace()匹配最后一次出现的字符串

时间:2014-08-23 16:09:51

标签: javascript regex coffeescript

我正在为产品变体构建一个“添加新行”功能,而我正在努力使用匹配表单属性键所需的正则表达式。所以,我基本上是克隆行,然后递增键,就像这样(coffeescript):

  newrow = oldrow.find('select, input, textarea').each ->
    this.name = this.name.replace(/\[(\d+)\]/, (str, p1) ->
      "[" + (parseInt(p1, 10) + 1) + "]"
    )
    this.id = this.id.replace(/\_(\d+)\_/, (str, p1) ->
      "_" + (parseInt(p1, 10) + 1) + "_"
    )
  .end()

这会正确地增加名称为product[variations][1][name]的字段,并将其转换为product[variations][2][name]

但每个变体可以有多个选项(例如,颜色可以是红色,蓝色,绿色),因此我需要将此product[variations][1][options][2][name]转换为product[variations][1][options][3][name],只留下变体键。我需要什么正则表达式才能匹配最后一次出现的键(选项键)?

2 个答案:

答案 0 :(得分:2)

您可以使用负向前瞻:

/\[(\d+)\](?!.*\[\d+\])/

(?!_____)部分是否定前瞻。

这就是说:只有在字符串后面的方括号中没有数字时,才能在方括号之间匹配和捕获数字。 Live Explanation

var m = "product[variations][1][options][3][name]".match(/\[(\d+)\](?!.*\[\d+\])/);
console.log(m[1]); // "3"

答案 1 :(得分:0)

有时候我喜欢尽可能使用拆分:

var a = 'product[variations][1][options][2][name]'.split('][');
// you can then replace before last value :
a[a.length-2] = indexYouWish;
var newName = a.join('][');