【问题标题】:How can I increment a number matched via regex?如何增加通过正则表达式匹配的数字?
【发布时间】:2009-12-16 05:38:11
【问题描述】:

我正在我的一个网络应用程序中添加一个新字段,供访问者添加产品。按下“添加产品”会克隆现有输入之一,我将其设置为空白值。

不过,我需要更新名称。名称采用以下格式:

<input type="text" name="product[0][0][3][title]" value="my product" id="input-AbGHtQS3" maxlength="150" />

我需要增加最后一个数字索引,即本例中的 3。

我写了一个正则表达式来匹配适当的字符,但是我怎样才能增加最后一个数字呢?

这是我的正则表达式:

/^product\[\d+\]\[\d+\]\[(\d+)\]\[.+\]/

我怎样才能增加最后一个数字?

【问题讨论】:

  • 为什么要在名称中添加看起来像 Javascript 数组的内容?稍后对其进行评估?
  • 所以我可以在 PHP 中以数组的形式轻松使用它

标签: javascript regex


【解决方案1】:

来自:Use RegExp to match a parenthetical number then increment it

replace 方法可以将函数作为其第二个参数。它获取匹配项(包括子匹配项)并返回替换字符串。其他人已经提到括号需要转义。

"Item Name (4)".replace(/\((\d+)\)/, function(fullMatch, n) {
    return "(" + (Number(n) + 1) + ")";
});

所以,

*编辑:

这应该可以工作

"product[0][0][3][title]".replace(/(^product\[\d+\]\[\d+\]\[)(\d+)(\]\[.+\])/, function(fullMatch, n, a, o) {
    return n + (Number(a) + 1) + o;
});

【讨论】:

  • 不知道您可以将匿名函数作为第二个参数!每天学些新东西。非常感谢,现在将实施。
  • 无法让它工作 - 请参阅 jsbin.com/obila/edit 它返回 4 - 对吗?那么我将如何使 name 属性正确读取?即'产品[0][0][4][标题]'
  • 啊废话,它正在替换整个匹配。我再试一次。
【解决方案2】:

更迭代的方法:

r = /^(product\[\d+\]\[\d+\]\[)(\d+)(\]\[[a-z]+\])$/;
m = s.match(r);
if (!m) { /* do something smart; */ }
s.replace(r, "$1" + (Number(m[2]) + 1) + "$3");

我在您的正则表达式的头部和尾部添加了一个捕获组。然后匹配、递增和重新组合字符串。

+1 用于正则表达式上的匹配函数,但我不知道那个技巧。

【讨论】:

    【解决方案3】:

    基于Andrew's answer,但更正为返回整个字符串:

    "product[0][0][3][title]".replace (
        /^(product\[\d+\]\[\d+\]\[)(\d+)(\]\[.+\])/,
        function(fullMatch, pre, n, post) {
            return pre + (Number(n) + 1) + post;
        }
    );
    

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多