web-dev-qa-db-fra.com

RegEx qui correspondra à la dernière occurrence de point dans une chaîne

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?

51
alt

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);
}

Le voir en action.

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.

92
Jon

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]"

26
Salman A

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.

6
user193476

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);
​
5
Tats_innit

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
3
JRS

Utilisez \. pour faire correspondre un point. Le caractère . correspond à à tout caractère.

Donc str.replace(/\.([^\.]*)$/, ' @2x.').

2
linepogl
'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "$1.@x2$2")
1
한국인

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('.');
1
J_A_X

Vous pouvez simplement faire comme ça,

> "tro.lo.lo.lo.lo.lo.Zip".replace(/^(.*)\./, "$1@2x");
'tro.lo.lo.lo.lo.lo@2xzip'
1
Avinash Raj