Regex: получить имя файла без расширения в одном кадре?

Я хочу получить только имя файла с помощью regex, поэтому я пробовал простые вещи, такие как

([^.]*)

что, конечно, работает только если имя файла имеет одно расширение. Но если это так ... --2--> Я хочу adfadsfads.blah. Как я могу сделать это с regex?

что касается вопроса Дэвида, "почему вы используете regex" для этого, ответ: "для удовольствия.- На самом деле я использую простой код!--5-->

length_of_ext = File.extname(filename).length
filename = filename[0,(filename.length-length_of_ext)]

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

6 ответов


попробуйте это:

(.+?)(\.[^.]*$|$)

Это:

  • захват имен файлов, которые начинаются с точки (например,".журналы" файл ".logs", а не расширение файла), которое распространено в Unix.
  • получает все, кроме последней точки: "foo.бар.jpeg "gets you" foo.бар."
  • обрабатывает файлы без точки: "секретное письмо" получает "секретное письмо".

Примечание: как предложил комментатор j_random_hacker, это выполняется как объявлено, но возможно, вы захотите предшествовать вещам с якорем для целей читаемости.


все, за которым следует точка, за которой следует один или несколько символов, которые не являются точкой, а затем конец строки:

(.+?)\.[^\.]+$

все-до последней точки сгруппированы для облегчения поиска.

Если вы не на 100% уверен, что каждый файл будет иметь расширение, попробовать:

(.+?)(\.[^\.]+$|$)

Как насчет 2 захватывает один для конца и один для имени файла.

например.

(.+?)(?:\.[^\.]*$|$)

^(.*)\(.*)(\..*)$
  1. получает путь без последнего \
  2. файл без расширения
  3. расширение с .

примеры:

c:\Books.accdb
(c:)(Books)(.accdb)

не поддерживает несколько . в имя файла Поддерживает . в пути к файлу


хорошо, я не уверен, почему я буду использовать регулярное выражение для этого. Если я знаю, например, что строка является полным путем к файлу, я бы использовал другой API для получения имени файла. Регулярные выражения очень мощные, но в то же время довольно сложные (Вы только что доказали это, спросив, как создать такое простое регулярное выражение). Кто-то сказал: У вас была проблема, которую вы решили решить с помощью регулярных выражений. Теперь у вас две проблемы.

подумайте еще раз. Если вы находитесь на .NET платформа, например, затем взгляните наСистема.ИО.Путь класс.


я использовал этот шаблон для простого поиска:

^\s*[^\.\W]+$

этот текст:

file.ext
   fileext

   file.ext.ext
 file.ext
fileext

находит fileext во второй и последней строках.
Я применил его в виде текстового дерева папки (с пробелами в виде отступов).