Требуется регулярное выражение для конкретного Perl - PullRequest
0 голосов
/ 28 июня 2010

Есть Perl-скрипт, который должен обрабатывать все файлы определенного типа из заданного каталога. Файлы должны быть теми, которые заканчиваются на .jup, и НЕ ДОЛЖНЫ содержать слово «TEMP_» в имени файла. И.Е. Это должно разрешить corrected.jup, но не TEMP_corrected.jup.

Попробовали прогноз, но, очевидно, неверный шаблон:

/(?!TEMP_).*\.jup$/

Это возвращает все содержимое каталога, включая файлы с любым расширением и файлы, содержащие TEMP_, например, файл TEMP_corrected.jup.

1 Ответ

2 голосов
/ 29 июня 2010

Требуемое регулярное выражение:

/^((?!TEMP_).)*\.jup$/

Основным отличием является то, что ваше регулярное выражение не привязано в начале строки, поэтому оно соответствует любой подстроке, удовлетворяющей вашим критериям - поэтому в примере TEMP_corrected.jup подстроки corrected.jup и EMP_corrected.jup оба матч.

(Другое различие заключается в том, что, ставя () вокруг и заглядывания вперед, и ., вы гарантируете, что TEMP_ не допускается нигде в строке, а не просто в начале. Не уверен, важно ли это для вас или нет!)

Если вы получаете файлы, отличные от .jup files, тогда возникает другая проблема - ваше выражение должно соответствовать только файлам .jup. Вы можете проверить свое выражение с помощью:

perl -ne 'if(/^((?!TEMP_).)*\.jup$/) {print;}'

затем введите строки: perl будет выводить их обратно, если они совпадают, а не если они не совпадают. Например:

$ perl -ne 'if(/^((?!TEMP_).)*\.jup$/) {print;}'
foo
foo.jup
foo.jup              <-- perl printed this because 'foo.jup' matched
TEMP_foo.jup
...