2009-03-11 5 views
2

Кто-нибудь знает, почему это происходит:регулярное выражение отрубив последний символ имени файла

Filename:  031\_Lobby.jpg 

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

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

Это производит это:

031\_Lobb\_i.jpg 

По какой-то причине это разделочной последний символ из второго бэк- ссылка («y» в «Лобби». не делает, когда я удаляю [^_e|_i], поэтому я должен делать что-то неправильно, что связано с этим.

Спасибо!

+0

Вы забыли упомянуть, что должно быть правильным поведением – mkoryak

ответ

-1

Вы вынуждаете его иметь последний символ, отличный от _e и _i. Вы должны использовать это вместо (обратите внимание на последний *):

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

Почему -1? Что случилось с этим? – Seb

4

Вы вынуждаете его отрубить последний символ с этой частью вашего регулярного выражения:

[^_e|_i] 

Что переводится как: Любой одиночный символ, кроме "_", "e", "|", "i".

"y" в "Lobby" соответствует этому критерию.

"not _e" и "not _i", очевидно, но это не способ выразить это. Это было бы правильно:

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

Обратите внимание, что точка должна быть экранирована в регулярных выражениях.

+0

Это имеет смысл, но как я могу получить обратную ссылку, которая возвращает «Лобби», а не только «y»? Благодаря! – 2009-03-11 15:02:12

+0

Мое регулярное выражение уже делает это. Попробуйте. – Tomalak

+0

Существующий \ 2 backref должен возвращать «Лобби». (? bobince

1

удаляет «y», потому что [^ _e | _i] соответствует y, а .* соответствует всем параметрам до y.

Смежные вопросы