首页 文章

正则表达式只捕获文件名(没有网址路径,没有扩展名)

提问于
浏览
7

在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中 .

2 回答

  • 1

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

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

    并识别组1和2.组3是可选的扩展 .

    另一种可能性

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

    在这里,您将使用组4作为扩展名,并将组1和3的串联作为文件名 . 第2组仅用于制备3和4的化合物 .

  • 1

    经测试:

    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

相关问题