2009-03-11 15 views
2

誰もが知っているファイル名の最後の文字をオフにチョッピングされています。それは第二バックからの最後の文字をチョッピングだいくつかの理由正規表現は、なぜこれが起こっている

031\_Lobb\_i.jpg 

Filename:  031\_Lobby.jpg 

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

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

これを生成すること リファレンス(「ロビー」の「y」。ではありません。その場合、私は[^_e|_i]を削除しますので、それに関連する何かが間違っている必要があります。

ありがとうございました!

+0

正しい動作が何であるべきかを忘れた場合 – mkoryak

答えて

-1

あなたは_eと_iとは異なる最後の文字を持つことになります。

[^_e|_i] 

として変換されます:あなたは、あなたの正規表現のこの部分と最後の文字を切り落とすためにそれを強制

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

なぜ-1?これは何が問題なの? – Seb

4

を:あなたは(最後の*を注意してください)の代わりにこれを使用する必要があります任意の1文字を除いて"_","e","|","i"

"y""Lobby"がこの条件に一致します。

お客様平均"not _e"および"not _i"は、明らかにそれを表現する方法ではありません。これは正しいでしょう:

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

ドットは正規表現でエスケープする必要があります。

+0

それは理にかなっていますが、「y」だけでなく「ロビー」を返すバックリファレンスを取得するにはどうすればよいですか?ありがとう! –

+0

私のregexは既にそれを行います。試してみる。 – Tomalak

+0

既存の\ 2バックレファレンスは 'Lobby'を返します。 (?<!...)は実際の文字を取得しません。また、 '.jpg'の '。'はリテラルドット '\'でなければならず、 '任意の文字'を意味する素朴なドットではありません。 – bobince

1

[^ _e | _i]がyに一致し、.*がyの前のすべてと一致するため、 "y"が削除されています。