Я пытался найти способ сопоставить число в строке Javascript, заключенное в круглые скобки в конце строки, а затем увеличить его.
Скажем, у меня есть строка:
var name = "Item Name (4)";
Мне нужно RegExp для соответствия части (4), а затем мне нужно увеличить 4, а затем вернуть его в строку.
Это регулярное выражение, которое у меня есть:
\b([0-9]+)$\b
Это регулярное выражение не работает. Более того, я не знаю, как извлечь полученное целое число и вернуть его в то же место в строке.
Спасибо.
Я разберусь с этим, но мне все еще нужна помощь с другими вещами. Пока спасибо!
Вычисление и увеличение числа никогда не выполняется с помощью регулярного выражения, а только с помощью имеющегося языка программирования. Regexo только находит и заменяет строки и не может выполнять аритметику.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я могу думать только о том, как сделать это в три этапа: извлечь, увеличить и заменить.
// 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 + ")");
Важные части выкройки:
'var name = "Item Name (4)"'.replace(/\(([\d]+)\)/, 1 + $1);
(непроверено)
Хотя это гораздо более логично ;-)
Не работает, потому что $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
1 + RegExp. $ 1 всегда возвращает 1 для меня.
Метод replace может принимать функцию в качестве второго аргумента. Он получает совпадение (включая под совпадения) и возвращает заменяющую строку. Другие уже упоминали, что скобки нужно избегать.
"Item Name (4)".replace(/\((\d+)\)/, function(fullMatch, n) {
return "(" + (Number(n) + 1) + ")";
});
Это правильный способ сделать это. Часто функциональная форма replace - это единственный удобный способ объединить мощь встроенного сканера регулярных выражений с возможностями произвольной формы определяемых пользователем функций. Я даже использовал замыкания, чтобы иметь функции с отслеживанием состояния с помощью replace ().
Ваш синтаксис регулярного выражения требует, чтобы вы избегали буквальных '(' и ')? Некоторые делают.