Подтвердить что ты не робот

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

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

([^\.]*)

который, конечно, работает только в том случае, если имя файла имеет одно расширение. Но если это adfadsfads.blah.txt, я просто хочу adfadsfads.blah. Как это сделать с помощью регулярного выражения?

В отношении вопроса Дэвида: "зачем вы используете для этого регулярное выражение", ответ "забава". Фактически, код, который я использую, прост

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

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

4b9b3361

Ответ 1

Попробуйте следующее:

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

Это будет:

  • Захват имен файлов, начинающихся с точки (например, ".logs" - это файл с именем ".logs", а не расширение файла), что является общим в Unix.
  • Получает все, кроме последней точки: "foo.bar.jpeg" получает вас "foo.bar".
  • Обрабатывает файлы без точки: "секретная буква" получает "секретную букву".

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

Ответ 2

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

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

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

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

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

Ответ 3

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

например.

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

Ответ 4

^(.*)\\(.*)(\..*)$
  • Возвращает путь без последнего \
  • Файл без расширения
  • Расширение с помощью .

Примеры:

c:\1\2\3\Books.accdb
(c:\1\2\3)(Books)(.accdb)

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

Ответ 5

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

Подумайте еще раз. Например, если вы находитесь на платформе .NET, посмотрите на System.IO.Path класс.

Ответ 6

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

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

для этого текста:

file.ext
   fileext

   file.ext.ext
 file.ext
fileext

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

Ответ 7

Просто имя файла, без пути и суффикса.

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