J'ai essayé de trouver un moyen de faire correspondre un nombre dans une chaîne JavaScript entourée de parenthèses à la fin de la chaîne, puis l'incrémenter.
Dites que j'ai une chaîne:
var name = "Item Name (4)";
J'ai besoin d'un RegExp pour faire correspondre la (4) partie, puis j'ai besoin d'incrémenter le 4 puis le remettre dans la chaîne.
C'est le regex que j'ai jusqu'ici:
\b([0-9]+)$\b
Ce regex ne fonctionne pas. En outre, je ne sais pas comment extraire l'entier récupéré et le remettre au même emplacement dans la chaîne.
Merci.
La méthode de remplacement peut prendre une fonction comme deuxième argument. Il obtient le match (y compris les sous-correspondances) et renvoie la chaîne de remplacement. D'autres ont déjà mentionné que les parenthèses doivent être échappées.
"Item Name (4)".replace(/\((\d+)\)/, function(fullMatch, n) { return "(" + (Number(n) + 1) + ")"; });
Je peux seulement penser à une façon de le faire en trois étapes: extraire, incrémenter et remplacer.
// 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 + ")");
Les parties importantes du modèle:
Pour que ce modèle fonctionne, vous risquez d'échapper à des parenthèses. De plus, \ b et $ sont inutiles. Ainsi
var s = "Item Name (4)"; var match = /\((\d+)\)/.exec( s ); var n = Number(match[1])+1; alert( s.replace( /\(\d+\)/, '('+n+')' ) );
Solution par david.clarke (testé)
"Item Name (4)".replace(/\(([0-9]+)\)/, '('+(1+RegExp.$1) + ')');
Mais je pense que c'est trop concis
UPD : Il s'est avéré que RegExp. $ 1 ne peut pas être utilisé comme paramètre de remplacement, car il fonctionne uniquement dans Opera
'var name = "Item Name (4)"'.replace(/\(([\d]+)\)/, 1 + $1);
(Non testé)