Regex: получить имя файла без расширения в одном снимке?
Я хочу получить только имя файла с помощью regex, поэтому я пробовал простые вещи, например
([^\.]*)
который, конечно, работает только в том случае, если имя файла имеет одно расширение. Но если это adfadsfads.blah.txt
, я просто хочу adfadsfads.blah
. Как это сделать с помощью регулярного выражения?
В отношении вопроса Дэвида: "зачем вы используете для этого регулярное выражение", ответ "забава". Фактически, код, который я использую, прост
length_of_ext = File.extname(filename).length
filename = filename[0,(filename.length-length_of_ext)]
но мне нравится изучать регулярное выражение, когда это возможно, потому что оно всегда появляется в коктейльных вечеринках Geek.
Ответы
Ответ 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
Просто имя файла, без пути и суффикса.
^.*[\\|\/](.+?)\.[^\.]+$