Регулярное выражение для извлечения имени файла из пути

Мне нужно извлечь только имя файла (без расширения файла) из следующего пути....

\\my-local-server\path\to\this_file may_contain-any&character.pdf

Я пробовал несколько вещей, большинство из которых основывалось на чем-то вроде http://regexr.com?302m5, но не может добраться туда

Ответ 1

^\\(.+\\)*(.+)\.(.+)$

Это регулярное выражение было проверено на следующих двух примерах:

\ var\www\www.example.com\index.php
\ Index.php

Первый блок "(. + \) *" соответствует пути к каталогу.

Второй блок "(. +)" Соответствует имени файла без расширения.

Третий блок "(. +) $" Соответствует расширению.

Ответ 2

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

[\w-]+\.

Обновить

@Geoman, если в имени файла есть пробелы, используйте приведенный ниже шаблон

[ \w-]+\.      (space added in brackets)

демонстрация

Ответ 3

Это всего лишь небольшое изменение в @hmd, поэтому вам не нужно обрезать .

[ \w-]+?(?=\.)

Demo

Действительно, спасибо идет в @hmd. Я только немного улучшил это.

Ответ 4

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

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

Он соответствует всем, кроме обратного слэша, а затем .pdf в конце строки.

Вы также можете (и, может быть, даже лучше) принять участие в группе захвата:

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

Но как вы относитесь к этой группе (часть в скобках) зависит от используемого вами языка или регулярного выражения. В большинстве случаев это будет выглядеть как $1 или \1, или библиотека предоставит некоторый метод для получения группы захвата по ее номеру после соответствия регулярного выражения.

Ответ 5

Если кто-то ищет абсолютный путь (и относительный путь) в JavaScript, регулярное выражение javascript в javascript для файлов:

var path = "c:\\my-long\\path_directory\\file.html";


((/(\w?\:?\\?[\w\-_\\]*\\+)([\w-_]+)(\.[\w-_]+)/gi).exec(path);

Выход:

[
"c:\my-long\path_directory\file.html", 
"c:\my-long\path_directory\", 
"file", 
".html"
]

Ответ 6

Здесь небольшая модификация замечательного ответа Angelo, которая позволяет пробелы в пути, имени файла и расширении, а также отсутствующие части:

function parsePath (path) {
    var parts = (/(\w?\:?\\?[\w\-_ \\]*\\+)?([\w-_ ]+)?(\.[\w-_ ]+)?/gi).exec(path);
    return {
        path: parts[0] || "",
        folder: parts[1] || "",
        name: parts[2] || "",
        extension: parts[3] || "",
    };
}

Ответ 7

Вот альтернатива, которая работает на windows/unix:

"^(([A-Z]:)?[\.]?[\\{1,2}/]?.*[\\{1,2}/])*(.+)\.(.+)"

Первый блок: путь
Второй блок: манекен
Третий блок: имя файла
Четвертый блок: расширение

Протестировано:

".\var\www\www.example.com\index.php"
"\var\www\www.example.com\index.php"
"/var/www/www.example.com/index.php"
"./var/www/www.example.com/index.php"
"C:/var/www/www.example.com/index.php"
"D:/var/www/www.example.com/index.php"
"D:\\var\\www\\www.example.com\\index.php"
"\index.php"
"./index.php"

Ответ 8

Нажмите кнопку Explain на этих ссылках, показанных TEST, чтобы увидеть, как они работают.


Это относится к расширению pdf.

TEST ^.+\\([^.]+)\.pdf$


Это относится к любому расширению, а не только к pdf.

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


([^.]+) Это группа захвата $1 для извлечения имени файла без расширения.


\\my-local-server\path\to\this_file may_contain-any&character.pdf

вернется

this_file may_contain-any&character

Ответ 9

Это регулярное выражение извлекает расширение файла, если группа 3 не равна null, это расширение.

.*\\(.*\.(.+)|.*$)

Ответ 10

также еще один для файла в dir и root

   ^(.*\\)?(.*)(\..*)$

для файла в каталоге

Full match  0-17    '\path\to\file.ext'
Group 1.    0-9 '\path\to\'
Group 2.    9-13    'file'
Group 3.    13-17   '.ext'

для файла в корне

Full match  0-8 'file.ext'
Group 2.    0-4 'file'
Group 3.    4-8 '.ext'

Ответ 11

Для большинства случаев (например, win, unx path, разделитель, пустое имя файла, точка, расширение файла) достаточно следующего:

 // grap the dir part (1), the dir sep(2) , the bare file name (3) 
 path.replaceAll("""^(.*)[\\|\/](.*)([.]{1}.*)""","$3")

Ответ 12

Я использую это регулярное выражение для замены имени файла файла на index. Он соответствует непрерывной строке символов, которая не содержит косой черты и сопровождается . и строкой символов слова. Он извлечет имя файла, включая пробелы и точки, но проигнорирует полное расширение файла.

const regex = /[^\\/]+?(?=\.\w+$)/

console.log('/path/to/file.png'.match(regex))
console.log('/path/to/video.webm'.match(regex))
console.log('/path/to/weird.file.gif'.match(regex))
console.log('/path with/spaces/and file.with.spaces'.match(regex))