RegEx, der mit dem letzten Vorkommen eines Punktes in einer Zeichenfolge übereinstimmt

Lesezeit: 3 Minuten

Benutzer-Avatar
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:

tro.lo.png -> [email protected]

Hier ist, was ich bisher habe, aber es wird nichts zusammenpassen …

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

irgendwelche Vorschläge?

  • 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

Benutzer-Avatar
Jon

Dafür brauchen Sie keine Regex. String.lastIndexOf Wird besorgt.

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

Sehen Sie es in Aktion.

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.

    – gdoron unterstützt Monica

    21. Juni 2012 um 8:17 Uhr

Benutzer-Avatar
Salmann A

Benutz einfach spezielles Ersatzmuster $1 in der Ersetzungszeichenfolge:

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

  • Beantwortet die OP-Frage richtig.

    – Qsteuer

    21. Juni 2012 um 8:26 Uhr

  • @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.

    – nhahtdh

    21. Juni 2012 um 8:17 Uhr


Benutzer-Avatar
Tats_innit

funktionierende Demo http://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);​

Um alle Zeichen vom Anfang der Zeichenfolge bis (einschließlich) dem letzten Vorkommen eines Zeichens abzugleichen, verwenden Sie:

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

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

Benutzer-Avatar
linepogl

Verwenden \. einem Punkt entsprechen. Der Charakter . Streichhölzer irgendein Charakter.

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

Benutzer-Avatar
Avinash Raj

Du könntest es einfach so machen,

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

1298190cookie-checkRegEx, der mit dem letzten Vorkommen eines Punktes in einer Zeichenfolge übereinstimmt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy