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

How to extract filename + extension only from full path in Javascript?

从 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 的 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));

这将 return "yourfile.pdf"

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
/.+?(?=\?)/

此正则表达式将匹配字符“?”之前的任何内容。找到(不包括该字符)。

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

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

如果你想用 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}`);
    });
}

我最终得到的解决方案:

file = file_path.replace(/^(?:[^/?]/)([^/?])./g, 函数(a,b) { return unescape(b); });