2009-06-20 6 views
4

ich eine Reihe von Dateien, die wie folgt aussehen:wie Punkte aus Dateinamen zu beseitigen, mit Ausnahme der Dateierweiterung

A.File.With.Dots.Instead.Of.Spaces.Extension 

Was ich über einen regulären Ausdruck verwandeln wollen in:

A File With Dots Instead Of Spaces.Extension 

Es muss in einer Regex sein (weil ich es mit dem Batch-Umbenennungstool von Total Commander verwenden möchte).

Hilf mir, Regex Gurus, du bist meine einzige Hoffnung.

bearbeiten

Mehrere Personen vorgeschlagen zweistufigen Lösungen. Zwei Schritte machen dieses Problem wirklich trivial, und ich hoffte wirklich, eine Ein-Schritt-Lösung zu finden, die in TC funktionieren würde. Ich habe, BTW, geschafft, eine Ein-Schritt-Lösung zu finden, die funktioniert, solange eine gerade Anzahl von Punkten im Dateinamen vorhanden ist. Ich hoffe also immer noch auf einen silbernen Ausdruck (oder einen Beweis/eine Erklärung dafür, warum man absolut unmöglich ist).

+0

Würde es Ihnen etwas ausmachen, Ihre Lösung hier zu posten? – Helen

+0

@Helen: ersetzen "\. ([^.] +) \." mit "$ 1". Dies funktioniert für alle Dateinamen mit einer ungeraden Anzahl von Punkten. –

Antwort

1

Hier ist eine auf der Grundlage Ihrer fast-Lösung:

/\.([^.]*(\.[^.]+$)?)/\1/ 

Das ist, grob „jeder Punkt stuff, minus dem Punkt, und vielleicht plus weiteren Punkte Sachen am Ende der Zeile“ Ich konnte nicht ganz sagen, ob du die Punkte entfernt oder in Leerzeichen umgewandelt haben wolltest - wenn letzteres, ändere die Ersetzung zu "\ 1" (abzüglich der Anführungszeichen, natürlich).

[Bearbeiten das + a *, wie Helens unten zu ändern.]

1

Grundsätzlich gilt:

/\.(?=.*?\.)// 

wird es in reinen Regex Bedingungen tun. Das bedeutet, dass alle Perioden ersetzt werden müssen, denen eine Zeichenfolge folgt (nicht-gierig) und dann eine Periode mit nichts. Dies ist ein positive lookahead.

In PHP geschieht dies so:

$output = preg_replace('/\.(?=.*?\.)/', '', $input); 

Andere Sprachen variieren, aber das Prinzip ist das gleiche.

+0

Ich glaube nicht, dass? nach dem. * ist notwendig ... es wird sowieso nur zurückgehen. * Einige * Regex-Engines * könnten * es vielleicht ein wenig besser optimieren, aber [^.] * würde stattdessen sogar für eine wirklich nicht optimierte Regex-Engine optimal funktionieren. –

+0

Im Allgemeinen möchten Sie wahrscheinlich Backtracking vermeiden, wenn Sie können. – cletus

+0

die meisten Regex-Engines rückgängig machen unabhängig von der? ob man da ist oder nicht, es ist nur eine Frage, wie weit sie zurückgehen werden. –

0

Das können Sie mit Lookahead machen. Allerdings weiß ich nicht, welche Art von Regex-Unterstützung Sie haben.

/\.(?=.*\.)// 

, die keinen Punkt grob übersetzt /\./, die später etwas und einen Punkt hat. Offensichtlich ist der letzte Punkt der einzige, der nicht einhält. Ich lasse die "Optionalität" von etwas zwischen Punkten aus, weil die Daten so aussehen, als würde immer etwas dazwischen sein und die "Optionalität" hat einen Performancekosten.

Check: http://www.regular-expressions.info/lookaround.html

4

Es erscheint regex Bibliothek Total Commander Lookarounds Ausdrücke nicht unterstützt, so sind Sie wahrscheinlich eine Reihe von Punkten zu einem Zeitpunkt gehen zu müssen, ersetzen, bis es keine Punkte übrig sind. Ersetzen:

([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)$ 

mit

$1 $2 $3.$4 

(Wiederholen Sie die Reihenfolge und die Anzahl der Rückreferenzierungen für mehr Effizienz Sie können bis zu $ ​​9, gehen die nicht ausreichen oder nicht..)

Es scheint keinen Weg zu geben, dies mit einem einzigen, definitiven Ausdruck in Total Commander zu tun, sorry.

+1

Es ist nicht notwendig, Punkte innerhalb von Zeichenklassen zu entkommen: ([^.] *) \. ([^.] *) \. ([^.] *) \. ([^.] *) $ – Helen

1

oder alle Punkte mit Platz ersetzen, ersetzen [Leerzeichen] [Erweiterung] mit. [Erweiterung]

A.File .With.Dots.Instead.Of.Spaces.Extension zu eine Datei mit Punkten statt Leerzeichen Erweiterung zu eine Datei anstatt mit Punkten von Spaces.Extension

0

ein weiteres Muster alle Punkte, aber die letzte in einen finden (Windows) Dateiname, den ich gefunden habe, funktioniert für mich in Mass File Renamer ist:

(?!\.\w*$)\. 

Ich weiß nicht, wie nützlich das für andere Benutzer ist, aber diese Seite war ein frühes Sucher und wenn das hier gewesen wäre, hätte es hat ich einige Zeit gespeichert.

Es schließt das Ergebnis aus, wenn ihm eine ununterbrochene Folge von alphanumerischen Zeichen folgt, die zum Ende der Eingabe führt (Dateiname), aber ansonsten alle Instanzen des Punktzeichens findet.

Verwandte Themen