15

我正在尝试编写一个正则表达式以从 url 获取文件名(如果存在)。

这是我到目前为止所拥有的:

(?:[^/][\d\w\.]+)+$

所以从 url http://www.foo.com/bar/baz/filename.jpg,我应该匹配filename.jpg

不幸的是,我匹配最后一个之后的任何内容/

我怎样才能收紧它,以便它只在它看起来像一个文件名时才抓住它?

4

13 回答 13

37

上面的示例无法从此 URL 获取文件名“file-1.name.zip”:

"http://sub.domain.com/sub/sub/handler?file=data/file-1.name.zip&v=1"

所以我创建了我的 REGEX 版本:

[^/\\&\?]+\.\w{3,4}(?=([\?&].*$|$))

解释:

[^/\\&\?]+          # file name - group of chars without URL delimiters
\.\w{3,4}           # file extension - 3 or 4 word chars
(?=([\?&].*$|$))    # positive lookahead to ensure that file name is at the end of string or there is some QueryString parameters, that needs to be ignored
于 2014-10-08T09:05:02.523 回答
20

这个对我很有效。

(\w+)(\.\w+)+(?!.*(\w+)(\.\w+)+)
于 2014-07-13T07:54:19.180 回答
11

非PCR

(?:[^/][\d\w\.]+)$(?<=\.\w{3,4})

聚合酶链反应

(?:[^/][\d\w\.]+)$(?<=(?:.jpg)|(?:.pdf)|(?:.gif)|(?:.jpeg)|(more_extension))

演示

由于您使用regexpal.com基于 javascript 的测试(不支持后视),请尝试使用此方法

(?=\w+\.\w{3,4}$).+
于 2013-01-23T09:07:29.557 回答
11
(?:.+\/)(.+)

选择所有直到最后一个正斜杠 (/),捕获此正斜杠之后的所有内容。使用子模式 $1。

于 2015-05-05T20:58:37.497 回答
8

我正在使用这个:

(?<=\/)[^\/\?#]+(?=[^\/]*$)

解释:

(?<=):正面看后面,断言一个字符串有这个表达式,但不匹配。

(?<=/): 正斜杠“/”后面的正向查找,这意味着我正在寻找一个前面的表达式,但与正斜杠不匹配。

[^/\?#]+:一个或多个不是“/”、“?”的字符 或“#”,剥离搜索参数和哈希。

(?=[^/]*$): 积极向前看任何不匹配斜线的东西,然后匹配行尾。这是为了确保选择最后一个正斜杠段。

示例用法:

const urlFileNameRegEx = /(?<=\/)[^\/\?#]+(?=[^\/]*$)/;

const testCases = [
  "https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit#yo",
  "https://developer.mozilla.org/static/fonts/locales/ZillaSlab-Regular.subset.bbc33fb47cf6.woff2",
  "https://developer.mozilla.org/static/build/styles/locale-en-US.520ecdcaef8c.css?is-nice=true"
];

testCases.forEach(testStr => console.log(`The file of ${testStr} is ${urlFileNameRegEx.exec(testStr)[0]}`))

于 2019-05-22T13:37:39.600 回答
2

它也可能有效:

(\w+\.)+\w+$
于 2013-01-23T06:05:07.690 回答
1

你知道你的分隔符是什么样的,所以你不需要正则表达式。只是split字符串。由于您没有提及语言,因此这是 Perl 中的一个实现:

use strict;
use warnings;

my $url = "http://www.foo.com/bar/baz/filename.jpg";
my @url_parts = split/\//,$url;

my $filename = $url_parts[-1];

if(index($filename,".") > 0 )
{
    print "It appears as though we have a filename of $filename.\n";
}
else
{
    print "It seems as though the end of the URL ($filename) is not a filename.\n";
}

当然,如果您需要担心特定的文件扩展名(png、jpg、html 等),请适当调整。

于 2013-01-23T09:10:16.083 回答
0
> echo "http://www.foo.com/bar/baz/filename.jpg" | sed 's/.*\/\([^\/]*\..*\)$/\1/g'
filename.jpg
于 2013-01-23T09:41:46.750 回答
0

假设您将使用 javascript:

        var fn=window.location.href.match(/([^/])+/g);
        fn = fn[fn.length-1]; // get the last element of the array
        alert(fn.substring(0,fn.indexOf('.')));//alerts the filename
于 2013-01-23T11:24:40.793 回答
0

这是您可以使用的代码:

\/([\w.][\w.-]*)(?<!\/\.)(?<!\/\.\.)(?:\?.*)?$

名称“。” 和“..”不被认为是正常的。

你可以在这里玩这个正则表达式https://regex101.com/r/QaAK06/1/

于 2018-08-02T21:21:33.550 回答
0

如果您使用的是JavaScript URL 对象,您可以将路径名与以下 RegExp 结合使用:

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

益处:

它匹配路径末尾的任何内容,但不包括可能的斜杠(只要没有两个斜杠)!

于 2021-03-29T18:47:00.140 回答
-1

试试这个:

(?:[^/]*+)$(?<=\..*)
于 2013-07-07T12:40:46.297 回答
-1

这对我有用,不管你是否有'。或没有“。” 它需要 url 的后缀

\/(\w+)[\.|\w]+$
于 2021-04-08T15:13:09.283 回答