2016-07-28 7 views
6

Я изучаю некоторые имена файлов. Но не могу понять, правильный регулярное выражение имена файлов может быть что угодно, но нужно проверить, если имя файла заканчиваетсяРасширение и язык Regex

  1. _ подчеркивание
  2. ан или ру или су (код страны 2 буквы)
  3. . (Точка)
  4. расширения (JPEG, JPG, MP4, PNG, GIF)

так файл

my_file_dummy_name.jpeg - not valid 
my_file_dummy_name_en.jpeg - valid 

Для Теперь я попробовал это (и работает, но может быть, есть лучшее решение)

/(\_\w.\.\w+)/g 

еще один:

/(\_[a-z]{2}\.[a-z]{3,4})/g 

ответ

10

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

Например, следующее регулярное выражение

/(\_\w{2}\.\w+)/g 

будет соответствовать файл my_file_dummy_name_de.mpeg, который видеофайл из Германии. Понятно, что мы не хотели бы смотреть на это в первую очередь.

Попробуйте это регулярное выражение:

_(en|ru|cy)\.(jpeg|jpg|mp4|png|gif)$ 

Demo здесь:

Regex101

+1

Позвольте downvotes начинать мальчиков! –

+1

Убей меня на это - https://jsfiddle.net/j93mtwjq/ –

+1

Конечно, это можно немного улучшить: '/_(?:en|ru|cy)\.(?:jpe?g|mp4|png | gif) $/', но это зависит от того, что ищет в regex :) –

2

Если вы хотите, чтобы регулярное выражение, чтобы сделать все проверки для вас, есть более строгий способ идти о это:

/_(en|ru|cy)\.(jpeg|jpg|mp4|png|gif)$/ 

Таким образом вы обеспечиваете все те ограничения, о которых вы говорили. Кроме того, нет необходимости в флагмане g, поскольку нас интересует только конец строки (вот почему я поставил якорь EOL $). Вы могли бы добавить, однако, флаг флагов gnore, если есть возможность смешанного случая в именах файлов.