【问题标题】:regex to capture just filename (no url path, no extension)正则表达式仅捕获文件名(无 url 路径,无扩展名)
【发布时间】:2015-05-03 22:19:49
【问题描述】:

在 JavaScript 中,我可以使用这个正则表达式 ([^\/]+)(\.[^\.\/]+)$ 来捕获 URL 中的文件名。它适用于以下情况:

http://a.com/b/file.name.ext
http://a.com/b/file.name.ext#hash
http://a.com/b/file.name.ext?query

但是如果没有扩展名则匹配失败:

不匹配

http://a.com/b/filename
http://a.com/b/filename#hash
http://a.com/b/filename?query

这是正常的。第二个捕获组期望最后有一个.ext 块。

如果我将第二个捕获组设为可选...

`([^\/]+)(\.[^\.\/]+)?$`

...然后第一个捕获组变得贪婪,并包括.ext 结尾,这是我不想要的。正则表达式引擎如何考虑可选的第二组?如何使扩展的存在成为可选?


注意:此正则表达式不适用于具有以下结构的 URL:

http://a.com/b/filename?query=a.b
http://a.com/b/filename.ext?query=a.b

在我的例子中,点永远不会出现在 URL 的后面。

【问题讨论】:

  • 只是不要匹配第一个贪婪组中的点:([^\/.]+)
  • @JoSo:文件名中可能有圆点。我已经编辑了我的问题以明确这一点。
  • 那么,如果您想要纯正则表达式,我认为您需要替代组:([^\/.]+)$|([^\/]+)(\.[^\/.]+)$ 并识别组 1 和 2。组 3 是可选扩展。
  • @JoSo 当然! (我正在尝试替代方案,但我没想过为完整的表达式做一个替代方案。)([^\/.]+)$|([^\/]+)(\.[^\/.]+)$ 为我工作(在第一个替代方案之后有一个$。如果你想给出这个答案,我可以给你积分。
  • http://a.com/b/filen.ame 中,无法判断ame 是名称的一部分还是扩展名! (除非您提供允许的扩展名列表)

标签: javascript regex


【解决方案1】:

如果您想要纯正则表达式(= 来自理论计算机科学的漂亮和干净的正则语言表达式,加上捕获组),那么您可以使用其他组来实现:

([^\/.]+)$|([^\/]+)(\.[^\/.]+)$

并确定第 1 组和第 2 组。第 3 组是可选扩展。

另一种可能性:

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

在这里,您将使用第 4 组作为扩展名,并使用第 1 组和第 3 组的串联作为文件名。第 2 组仅用于使 3 和 4 的复合成为可选。

【讨论】:

  • 如果没有扩展名,您的第二个命题也会捕获任何查询或哈希部分。见这里:regex101.com/r/hB9dK8/1
  • @JamesNewton 到目前为止,此页面上的所有正则表达式都捕获了这些。但是您可以通过在所有否定组中包含#? 来避免这种情况,并且不将输入结束与$ 匹配。或者更简单,只需事先剥离查询和哈希
【解决方案2】:

测试:

http://a.com/b/file.name.ext
http://a.com/b/filename
http://a.com/b/filename#hash
http://a.com/b/filename?query

var file = "http://a.com/b/filename#hash";
function getFileName(url) {
    var index = url.lastIndexOf("/") + 1;
    var filenameWithExtension = url.substr(index);
    var filename = filenameWithExtension.split(".")[0]; 
    filename = filename.replace(/(#|\?).*?$/, "");
    return filename;                                   
}

alert(getFileName(file));
//filename

参考资料:

lastindexof

split

substr

replace

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 2021-07-24
    • 2013-02-10
    • 2020-03-11
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多