RegEx, der mit dem letzten Vorkommen eines Punktes in einer Zeichenfolge übereinstimmt
Lesezeit: 3 Minuten
alt
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 eine Regex verwenden, um das letzte Vorkommen des Punktes durch eine andere Zeichenfolge wie zu ersetzen @2x und dann wieder der Punkt (sehr ähnlich wie ein Dateiname für ein Netzhautbild), dh:
Aktualisieren: Eine Regex-Lösung, nur so zum Spaß:
str = str.replace(/\.(?=[^.]*$)/, "@2x.");
Entspricht einem wörtlichen Punkt und bestätigt dann ((?=) ist positiver Ausblick), dass kein anderes Zeichen bis zum Ende der Zeichenfolge ein Punkt ist. Die Ersetzung sollte den einen übereinstimmenden Punkt enthalten, es sei denn, Sie möchten ihn entfernen.
Das gibt eine Ganzzahl der Position zurück, an der sich dieses Zeichen befindet, richtig?
– Alt
21. Juni 2012 um 8:13 Uhr
Wie kann ich diese Ganzzahl mit .replace() verwenden?
– Alt
21. Juni 2012 um 8:13 Uhr
@JacksonGariity: Das musst du nicht. String.substr wird die Sache abrunden.
– Jon
21. Juni 2012 um 8:14 Uhr
Coole Antwort! Warum ist das besser/effizienter/weniger Code als eine Regex?
– Alt
21. Juni 2012 um 8:16 Uhr
@JacksonGariety. Es ist viel besser lesbar und etwas schneller.
@Qtax: Nicht ganz, denn es funktioniert nicht, wenn der letzte Punkt auch das allerletzte Zeichen ist.
– Jon
21. Juni 2012 um 8:26 Uhr
@ Jon, stimmt. Also fast richtig. 😉 Aber /\.([^.]*)$/ tut es, keine Notwendigkeit für Lookarounds.
– Qsteuer
21. Juni 2012 um 8:32 Uhr
Ich bin mir nicht sicher, ob ein Dateiname ein . als allerletztes Zeichen.
– Salmann A
21. Juni 2012 um 9:44 Uhr
Sie können den Ausdruck verwenden \.([^.]*?):
str.replace(/\.([^.]*?)$/, "@2x.$1");
Sie müssen auf die verweisen $1 Untergruppe, um den Teil zurück in die resultierende Zeichenfolge zu kopieren.
Ich denke, das braucht einen weiteren Punkt am Ende von “$1@2x”, um zu funktionieren, richtig?
– Alt
21. Juni 2012 um 8:14 Uhr
War ein bisschen voreilig mit dieser Antwort – korrigiert, um mehr Sinn für Ihre ursprüngliche Regex zu machen
– Benutzer193476
21. Juni 2012 um 8:16 Uhr
Ich glaube, dir fehlt ein . in der Ersetzungszeichenfolge. Ich flüchte lieber .aber die Zeichenklasse ist möglicherweise einfacher zu lesen. .replace(/(.*)\./, "$1@2x."). Wie auch immer, +1 für eine einfache Lösung mit der gierigen Eigenschaft von * Quantor.
Sie brauchen einen negativen Lookahead, wenn Sie es mit Regex machen wollen, aber das sollten Sie wirklich nicht
– Benjamin Grünbaum
21. Juni 2012 um 8:12 Uhr