Utilisez RegExp pour associer un nombre parenthetique puis incrémentez-le

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:

  1. Vous devez échapper aux parens pour faire correspondre les parens littéraires
  2. Vous avez également besoin d'utiliser parens pour capturer le numéro afin que vous puissiez l'extraire de la correspondance.
  3. \ D correspond à un chiffre et est plus court et plus commun que d'écrire [0-9].

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é)