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% уверен, что каждый файл будет иметь расширение, попробовать:
(.+?)(\.[^\.]+$|$)
^(.*)\(.*)(\..*)$
- получает путь без последнего
\
- файл без расширения
- расширение с
.
примеры:
c:\Books.accdb
(c:)(Books)(.accdb)
не поддерживает несколько .
в имя файла
Поддерживает .
в пути к файлу
хорошо, я не уверен, почему я буду использовать регулярное выражение для этого. Если я знаю, например, что строка является полным путем к файлу, я бы использовал другой API для получения имени файла. Регулярные выражения очень мощные, но в то же время довольно сложные (Вы только что доказали это, спросив, как создать такое простое регулярное выражение). Кто-то сказал: У вас была проблема, которую вы решили решить с помощью регулярных выражений. Теперь у вас две проблемы.
подумайте еще раз. Если вы находитесь на .NET платформа, например, затем взгляните наСистема.ИО.Путь класс.
я использовал этот шаблон для простого поиска:
^\s*[^\.\W]+$
этот текст:
file.ext
fileext
file.ext.ext
file.ext
fileext
находит fileext
во второй и последней строках.
Я применил его в виде текстового дерева папки (с пробелами в виде отступов).