wake-up-neo.net

RegEx, das dem letzten Vorkommen von Punkt in einer Zeichenfolge entspricht

Ich habe einen Dateinamen, der mehrere Punkte enthalten kann und mit einer beliebigen Erweiterung enden kann:

tro.lo.lo.lo.lo.lo.png

Ich muss einen Regex verwenden, um das letzte Vorkommen des Punktes durch einen anderen String wie @2x und dann wieder den Punkt zu ersetzen (sehr ähnlich einer Netzhautbilddatei).

tro.lo.png -> [email protected]

Hier ist was ich bis jetzt habe, aber es passt zu nichts ...

str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");

irgendwelche Vorschläge?

51
alt

Sie brauchen dafür keine Regex. String.lastIndexOf reicht aus.

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

In Aktion sehen.

Update: Eine Regex-Lösung, nur zum Spaß:

str = str.replace(/\.(?=[^.]*$)/, "@2x.");

Stimmt mit einem Punkt überein und bestätigt ((?=) ist positive Lookahead ), dass kein Zeichen bis zum Ende der Zeichenfolge ein Punkt ist. Der Ersatz sollte den einen Punkt enthalten, der abgeglichen wurde, sofern Sie ihn nicht entfernen möchten.

92
Jon

Verwenden Sie einfach spezielles Ersetzungsmuster$1 in der Ersetzungszeichenfolge:

console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "[email protected]"

26
Salman A

Sie können den Ausdruck \.([^.]*?) verwenden:

str.replace(/\.([^.]*?)$/, "@2x.$1");

Sie müssen auf die $1-Untergruppe verweisen, um den Teil wieder in die resultierende Zeichenfolge zu kopieren.

6
user193476

Arbeitsdemohttp://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

Um alle Zeichen vom Anfang der Zeichenfolge bis (und einschließlich) zum letzten Vorkommen eines Zeichens zu finden, verwenden Sie:

^.*\.(?=[^.]*$)  To match the last occurrence of the "." character

^.*_(?=[^.]*$)   To match the last occurrence of the "_" character
3
JRS

Verwenden Sie \., um einen Punkt abzugleichen. Das Zeichen . stimmt mit any Zeichen überein.

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

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

Warum nicht einfach die Zeichenfolge teilen und das Suffix zum vorletzten Eintrag hinzufügen:

var arr = 'tro.lo.lo.lo.lo.lo.Zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');
1
J_A_X

Sie könnten einfach so machen,

> "tro.lo.lo.lo.lo.lo.Zip".replace(/^(.*)\./, "[email protected]");
'[email protected]'
1
Avinash Raj