Regex: получить имя файла без расширения в один выстрел? - PullRequest
13 голосов
/ 09 марта 2009

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

([^\.]*)

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

Что касается вопроса Дэвида, «зачем вам использовать регулярное выражение», то ответ «ради забавы». На самом деле, код, который я использую, прост

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

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

Ответы [ 7 ]

37 голосов
/ 09 марта 2009

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

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

Это будет:

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

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

4 голосов
/ 09 марта 2009

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

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

Точка «все до последнего» сгруппирована для удобного поиска.

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

(.+?)(\.[^\.]+$|$)
3 голосов
/ 09 марта 2009

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

например.

(.+?)(?:\.[^\.]*$|$)
1 голос
/ 28 февраля 2013
^(.*)\\(.*)(\..*)$
  1. Получает путь без последнего \
  2. Файл без расширения
  3. Удлинитель с .

Примеры:

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

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

0 голосов
/ 24 октября 2018

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

^.*[\\|\/](.+?)\.[^\.]+$
0 голосов
/ 14 апреля 2015

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

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

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

file.ext
   fileext

   file.ext.ext
 file.ext
fileext

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

0 голосов
/ 09 марта 2009

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

Подумай еще раз. Например, если вы работаете на платформе .NET, взгляните на System.IO.Path class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...