2009-03-11 5 views
2

Jeder, warum dies geschieht:regulären Ausdruck wird Abhacken wissen letzte Zeichen des Dateinamens

Filename:  031\_Lobby.jpg 

RegExp:  (\d+)\_(.*)[^\_e|\_i]\.jpg 

Replacement: \1\_\2\_i.jpg 

, die produziert dieses:

031\_Lobb\_i.jpg 

Aus irgendeinem Grund ist es das letzte Zeichen aus der zweiten Hinter- ist Zerhacken Referenz (die "y" in "Lobby". Es nicht tun, dass, wenn ich die [^_e|_i] entfernen, so dass ich etwas falsch machen muss, dass damit verbunden ist.

Danke!

+0

Sie vergessen zu erwähnen, was das richtige Verhalten sein sollte – mkoryak

Antwort

-1

Sie erzwingen ein letztes Zeichen, das sich von _e und _i unterscheidet. Sie sollten diese stattdessen verwenden (beachten Sie die letzte *):

(\d+)_(.*)[^_e|_i]*.jpg 
+0

Warum -1? Was ist daran falsch? – Seb

4

Sie zwingen das letzte Zeichen mit diesem Teil Ihrer regex abzuhacken:

[^_e|_i] 

was übersetzt: Jedes einzelne Zeichen außer "_", "e", "|", "i".

Die "y" in "Lobby" entspricht diesem Kriterium.

Sie bedeuten"not _e" und "not _i", natürlich, aber das ist nicht der Weg, es auszudrücken. Das wäre richtig:

(\d+)_(.+)(?<!_[ei])\.jpg 

Beachten Sie, dass der Punkt in regulären Ausdrücken maskiert werden muss.

+0

Das macht Sinn, aber wie bekomme ich dann einen Rückverweis, der die "Lobby" zurückgibt und nicht nur das "y"? Vielen Dank! –

+0

Meine Regex macht das schon. Versuche es. – Tomalak

+0

Das vorhandene Backref sollte "Lobby" zurückgeben. (? bobince

1

Es entfernt das "y", weil [^ _e | _i] mit dem y übereinstimmt, und .* stimmt mit allem vor dem y überein.

Verwandte Themen