用于从路径中提取文件名的正则表达式

时间:2012-02-20 14:56:34

标签: regex

我需要从以下路径中提取文件名(没有文件扩展名)....

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

我尝试了几件事,大部分是基于像http://regexr.com?302m5这样的东西,但是不能完全实现

19 个答案:

答案 0 :(得分:30)

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

这个正则表达式已经在这两个例子上进行了测试:

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

第一个块“(。+ \)*”匹配目录路径。
第二个块“(。+)”匹配没有扩展名的文件名。
第三个块“(。+)$”匹配扩展名。

答案 1 :(得分:10)

这将获得文件名,但也会得到点。您可能希望在代码中截断它的最后一位数字。

[\w-]+\.

<强>更新

@Geoman如果文件名中有空格,则使用下面的修改模式

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

Demo

答案 2 :(得分:4)

尝试this

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

它匹配除了反斜杠之后的所有内容,后跟字符串末尾的.pdf

您也可以(也许甚至更好)将您想要的部分带入捕获组:

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

但是你如何引用这个组(括号中的部分)取决于你正在使用的语言或正则表达式。在大多数情况下,它会像$1\1一样,或者库将提供一些方法,以便在regexp匹配后通过其编号获取组。

答案 3 :(得分:4)

这只是@ hmd的一个小变化,所以你不必截断.

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

Demo

真的,谢谢@hmd。我只是略有改进。

答案 4 :(得分:3)

如果有人正在寻找一个Windows绝对路径(和相对路径)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"
]

答案 5 :(得分:3)

我使用@"[^\\]+$" 这样就给出了包含扩展名的文件名。

答案 6 :(得分:1)

这是对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 :(得分:0)

如果你想返回带有扩展名的文件名 Regex 应该如下:

[A-Za-z0-9_\-\.]+\.[A-Za-z0-9]+$

适用于

path/to/your/filename.some
path/to/your/filename.some.other
path\to\your\filename.some
path\to\your\filename.some.other
http://path/to/your/filename.some
http://path/to/your/filename.some.other
And so on

返回带扩展名的完整文件名(例如:filename.some 或 filename.some.other)


如果你想返回没有最后一个扩展名的文件名,正则表达式应该如下:

[A-Za-z0-9_\-\.]+(?=\.[A-Za-z0-9]+$)

返回没有最后一个扩展名的完整文件名(例如:“filename”代表“filename.some”,“filename.some”代表“filename.some.other”)

答案 8 :(得分:0)

回答:

  • 文件名和目录空间支持
  • 命名捕获组
  • 获取无限的文件扩展名(捕获file.tar.gz,而不仅仅是file.tar
  • * NIX和Win支持

^.+(\\|\/)(?<file_name>([^\\\/\n]+)(\.)?[^\n\.]+)$

说明:

  1. ^.+(\\|\/)获取文件路径中最后/\之前的所有内容
  2. (?<file_name>开始命名捕获组
  3. ([^\\\/\n]+)除了换行符或新文件外,什么都不会得到
  4. (\.)?[^\n\.]+并不需要,但对于文件名中包含奇数字符的问题非常有用
  5. )$结束命名捕获组和结束行

请注意,如果将其放在字符串中,并且需要转义反斜杠(例如C),则将使用以下字符串:

"^.+(\\\\|\/)(?<file_name>([^\\\/\n]+)(\.)?[^\n\.]+)$"

答案 9 :(得分:0)

这里是一种提取文件名而不带扩展名的解决方案。 我从@Hammad Khan的答案开始,然后在搜索字符中添加点。因此,点可以是文件名的一部分:

<a>

然后使用正则表达式向前看[ \w-.]+\. 作为点,这样它将在最后一个点(扩展名之前的点)停止搜索,并且该点将不会出现在结果中:

(?= )

重新排序,没有必要,但是看起来更好:

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

答案 10 :(得分:0)

这项工作...

.*\/(.+)$

在这里发布以便获得反馈

答案 11 :(得分:0)

直接方法:

要回答您所写的问题,这将提供最精确的匹配项:

^\\\\my-local-server\\path\\to\\(.+)\.pdf$

常规方法:

此正则表达式简短明了,与Windows和* NIX上任何文件夹(带或不带扩展名)中的任何文件名匹配:

.*[\\/]([^.]+)

如果文件名中包含多个点,则上述正则表达式将捕获文件名,直到第一个点为止。如果您知道没有扩展名的文件或没有带点的路径,则可以轻松修改该值以匹配到最后一个点。

如果您知道该文件夹仅包含.pdf文件,或者您只对.pdf文件感兴趣,并且还知道该扩展名永远不会拼写错误,那么我将使用此正则表达式:

.*[\\/](.+)\.pdf$

说明:

  • .与行终止符匹配。
  • *将上一个匹配项从重复多次。
  • [\\/]匹配最后一个反斜杠或正斜杠(以前的斜杠由.*使用)。如果您知道仅使用一种类型的环境,则可以省略反斜杠或正斜杠。 如果要捕获路径,请在括号中用.*.*[\\/]括起来。
  • 肢体感觉将捕获其中匹配的事物。
  • [^.]与任何非文字点匹配。
  • +重复前一次比赛一次或多次,并尽可能多。
  • \.与文字点匹配。
  • pdf与字符串pdf匹配。
  • $声明字符串的结尾。

如果您想将文件名中的零,一个或多个点匹配到一个可变路径中,该路径也可能包含点,则它将变得很丑陋。对于这种情况,我没有提供答案,因为我认为这不太可能。

编辑:要还捕获没有路径的文件名,请用(?:.*[\\/])?(这是一个可选的非捕获组)替换第一部分。

答案 12 :(得分:0)

我正在使用此正则表达式将文件名替换为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))

答案 13 :(得分:0)

在显示 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

答案 14 :(得分:0)

在大多数情况下(例如win,unx路径,分隔符,裸文件名,点,文件扩展名),以下一种就足够了:

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

答案 15 :(得分:0)

还有一个用于dir和root的文件

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

用于dir中的文件

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

for root

中的文件
Full match  0-8 `file.ext`
Group 2.    0-4 `file`
Group 3.    4-8 `.ext`

答案 16 :(得分:0)

此正则表达式提取文件扩展名,如果组3不为null,则为扩展名。

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

答案 17 :(得分:0)

这是一个适用于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"

答案 18 :(得分:-1)

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

示例:

/^(.*[\\\/])?(.*?)(\.[^.]*?|)$/.exec("C:\\folder1\\folder2\\foo.ext1.ext")

结果:

0: "C:\folder1\folder2\foo.ext1.ext"
1: "C:\folder1\folder2\"
2: "foo.ext1"
3: ".ext"

$1捕获组是文件夹
$2捕获组是不带扩展名的名称
$3捕获组是扩展名(仅最后一个)

适用于:

  • C:\folder1\folder2\foo.ext
  • C:\folder1\folder2\foo.ext1.ext
  • C:\folder1\folder2\name-without extension
  • only name
  • name.ext
  • C:\folder1\folder2\foo.ext
  • /folder1/folder2/foo.ext
  • C:\folder1\folder2\foo
  • C:\folder1\folder2\
  • C:\special&chars\folder2\f [oo].ext1.e-x-t