J'ai un nom de fichier qui peut avoir plusieurs points et qui peut se terminer par n'importe quelle extension:
tro.lo.lo.lo.lo.lo.png
Je dois utiliser une expression rationnelle pour remplacer la dernière occurrence du point par une autre chaîne telle que @2x
, puis à nouveau le point (très semblable à un nom de fichier d'image rétine), à savoir:
tro.lo.png -> [email protected]
Voici ce que j'ai jusqu'à présent mais cela ne correspond à rien ...
str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");
aucune suggestion?
Vous n'avez pas besoin d'une regex pour cela. String.lastIndexOf
va faire.
var str = 'tro.lo.lo.lo.lo.lo.Zip';
var i = str.lastIndexOf('.');
if (i != -1) {
str = str.substr(0, i) + "@2x" + str.substr(i);
}
Update: Une solution regex juste pour le plaisir:
str = str.replace(/\.(?=[^.]*$)/, "@2x.");
Correspond à un point littéral puis affirme ((?=)
est regard positif ) qu'aucun autre caractère jusqu'à la fin de la chaîne n'est un point. Le remplacement doit inclure le point correspondant, sauf si vous souhaitez le supprimer.
Utilisez simplement modèle de remplacement spécial$1
dans la chaîne de remplacement:
console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "[email protected]"
Vous pouvez utiliser l'expression \.([^.]*?)
:
str.replace(/\.([^.]*?)$/, "@2x.$1");
Vous devez référencer le sous-groupe $1
pour copier la partie dans la chaîne résultante.
démo de travailhttp://jsfiddle.net/AbDyh/1/
code
var str = 'tro.lo.lo.lo.lo.lo.Zip',
replacement = '@2x.';
str = str.replace(/.([^.]*)$/, replacement + '$1');
$('.test').html(str);
alert(str);
Pour faire correspondre tous les caractères depuis le début de la chaîne jusqu'à (et y compris) la dernière occurrence d'un caractère, utilisez:
^.*\.(?=[^.]*$) To match the last occurrence of the "." character
^.*_(?=[^.]*$) To match the last occurrence of the "_" character
Utilisez \.
pour faire correspondre un point. Le caractère .
correspond à à tout caractère.
Donc str.replace(/\.([^\.]*)$/, ' @2x.')
.
'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "$1.@x2$2")
Pourquoi ne pas simplement scinder la chaîne et ajouter le suffixe à l'avant-dernière entrée:
var arr = 'tro.lo.lo.lo.lo.lo.Zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');
Vous pouvez simplement faire comme ça,
> "tro.lo.lo.lo.lo.lo.Zip".replace(/^(.*)\./, "$1@2x");
'tro.lo.lo.lo.lo.lo@2xzip'