Какое регулярное выражение я должен использовать, чтобы найти имя файла, которое не содержит указанной строки? - PullRequest
3 голосов
/ 19 апреля 2019

Я пытаюсь создать список файлов, находящихся в папке, используя функцию preg_match. Тем не менее, я хотел бы опустить файлы, которые содержат строку «_min» между их именем файла и их расширениями. Имена файлов должны состоять только из буквенно-цифровых символов и символов подчеркивания, а расширения должны быть только jpg и gif. Например:
desc_125f.jpg -> совпало,
desc#_56.jpg -> не соответствует (содержит #),
bla_bla.gif -> совпало,
bla_bla.png -> не соответствует (расширение png),
desc_125f_min.jpg -> не соответствует (содержит _min между именем файла и расширением) ,
desc_min256.gif -> совпало (_min не находится между именем файла и расширением).
Каким должен быть шаблон регулярного выражения?

Я пробовал это: ^\w+(?!_min)\.(jpg|gif)$, но это не работает, как я ожидал, потому что desc_125f_min.jpg было найдено.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Проблема скорее в том, что вы используете взгляд впереди прямо перед ., где вы действительно хотите посмотреть позади .

^\w+(?<!_min)\.(jpg|gif)$

См. демо в регулярном выражении 101 .Для уменьшения обратного отслеживания сделайте квантификатор \w притяжательным .

1 голос
/ 19 апреля 2019

Проблема с вашим регулярным выражением в том, что \w+ поглощает все символы вплоть до ., поэтому отрицательный прогноз _min всегда будет успешным. Вам нужно переместить отрицательный взгляд в начало регулярного выражения:

^(?!.*_min\.)\w+\.(jpg|gif)$

Демонстрация на regex101

...