如何仅从Javascript的完整路径中提取文件名和扩展名?

问题描述 投票:0回答:3

从API返回的文件路径如下:

https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97

我想提取文件名和扩展名,并替换所有ASCII表达式,例如%20。所以返回的最终结果应该是:

Corp_Data_Collection.pdf

关于如何使用Javascript完成此操作的任何想法?

javascript regex filepath
3个回答
3
投票

您可以使用JavaScript的URL构造函数从URL中获取路径名,如下所示:

const url = new URL("https://yourlongurl.com/something/yourfile.pdf");
const pathname = url.pathname;

然后从路径名中使用substring提取其最后一部分,如下所示:

const filename = unescape(pathname.substring(pathname.lastIndexOf('/') + 1));

这将返回"yourfile.pdf"


0
投票
let link =
    "https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97";

let regex = link.match(/.+?(?=\?)/)[0].split("/");

console.log(decodeURIComponent(regex[regex.length - 1]));
// Corp Data Collection.pdf
/.+?(?=\?)/

此正则表达式将匹配任何字符,直到char“?”找到(不包括此字符)。

然后,获取第一个匹配的元素并将字符串拆分为数组(使用“ /”)。

然后,解码数组的最后一个元素


0
投票

如果您想使用RegEx明确地执行此操作,则可以使用此RegEx:\/([^\/]*\.[^\/]*)\?

[\/从字面上匹配(正斜杠)。

[^\/]*匹配除斜线以外的所有内容超过0次。

[\.从字面上匹配.

[^\/]*\.[^\/]*周围的括号使该组不匹配。

[\?从字面上匹配?

您可以使用此JS代码:

const regex = /\/([^\/]*\.[^\/]*)\?/gm;
const str = `https://my-bucket.s3.amazonaws.com/media/private/files/Corp%20Data%20Collection.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA6FUWELJHGJHGLIJI4Hss2F20191204%2Fca-central-1%2Fs3%2Faws4_request&X-Amz-Date=20191204T185901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=2a227681a180d8785be4edfa9e15dkjhsdkjs8796937182d9c33fc12a0e52affe97`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }

    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.