使用RegExp匹配括号中的数字并将其递增

10
我一直在试图找到一种方法,在Javascript字符串中匹配括号中的数字(该数字位于字符串结尾处),然后将其递增。

比如我有一个字符串:

var name = "Item Name (4)";

我需要一个正则表达式来匹配(4)这部分,然后我需要将4递增并放回到字符串中。

这是我目前拥有的正则表达式:

\b([0-9]+)$\b

这个正则表达式不起作用。此外,我不知道如何提取检索到的整数并将其放回到字符串中相同的位置。

谢谢。


你的正则表达式语法是否需要转义括号 '(' 和 ')'?有些需要。 - dmckee --- ex-moderator kitten
我会研究一下,但其他的问题还需要帮助。到目前为止,非常感谢! - Joel Verhagen
1
数字的评估和增量计算从来不使用正则表达式完成,而是通过手头的编程语言进行操作。Regexo 只能查找和替换字符串,无法执行算术运算。 - Tulains Córdova
4个回答

21

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

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

2
这是正确的方法。通常,使用replace函数形式是将内置正则表达式扫描器的能力与自定义函数的自由形式结合起来的唯一便捷方式。我甚至使用闭包在replace()中实现了“有状态”的函数。 - Jason S

0

我只能想到一种方法来完成它,分为三个步骤:提取、增加和替换。

// Tested on rhino
var name = "Item Name (4)";
var re = /\((\d+)\)/;

match = re.exec(name);
number = parseInt(match[1]) + 1;
name = name.replace(re, "(" + number + ")");

模式的重要部分:

  1. 您需要转义括号以匹配文字括号
  2. 您还需要使用括号来捕获数字,以便从匹配中提取它。
  3. \d匹配数字,比写出[0-9]更短且更常见。

0
为了使这个模式起作用,您应该转义括号。此外,\b和$是不必要的。因此,
var s = "Item Name (4)"; 
var match = /\((\d+)\)/.exec( s ); 
var n = Number(match[1])+1; 
alert( s.replace( /\(\d+\)/, '('+n+')' ) );

由david.clarke提供的解决方案(已测试)

"Item Name (4)".replace(/\(([0-9]+)\)/, '('+(1+RegExp.$1) + ')');

但我认为它太简洁了

更新:事实证明RegExp.$1不能用作替换参数的一部分,因为它只在Opera中起作用。


对我来说, 1 + RegExp.$1 总是返回 1。 - nickf

-1

'var name = "Item Name (4)"'.replace(/\(([\d]+)\)/, 1 + $1);

(未经测试)


虽然更加简洁 ;-) - undefined
无法工作,因为$1是一个字符串(即使它不是语法错误)。 - JJJ

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