Используйте RegExp, чтобы сопоставить число в скобках, а затем увеличить его

Я пытался найти способ сопоставить число в строке Javascript, которая заключена в круглые скобки в конце строки, а затем увеличить его.

Скажем, у меня есть строка:

var name = "Item Name (4)";

Мне нужно RegExp, чтобы соответствовать (4) часть, а затем мне нужно увеличить 4, а затем положить его обратно в строку.

Это регулярное выражение, которое я имею до сих пор:

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

Это регулярное выражение не работает. Кроме того, я не знаю, как извлечь полученное целое число и вернуть его в то же место в строке.

Благодарю.

4 ответа

Решение

Метод replace может принимать функцию в качестве второго аргумента. Он получает совпадение (включая подсовпадения) и возвращает строку замены. Другие уже упоминали, что скобки нужно избегать.

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

Для того, чтобы этот шаблон работал, вы должны избежать скобок. Кроме того, \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) + ')');

Но я думаю, что это слишком лаконично

UPD: Оказалось, что RegExp.$1 нельзя использовать как часть параметра replace, потому что он работает только в Opera

Я могу только придумать способ сделать это в три этапа: извлечь, увеличить и заменить.

// 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].

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

(Непроверенные)

Другие вопросы по тегам