Используйте 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 + ")");
Важные части шаблона:
- Вы должны избежать паренов, чтобы соответствовать буквальным паренам
- Вам также нужно использовать парены, чтобы захватить число, чтобы вы могли извлечь его из матча.
- \ d соответствует цифре и короче и встречается чаще, чем выписывание [0-9].
'var name = "Item Name (4)"'.replace(/\(([\d]+)\)/, 1 + $1);
(Непроверенные)