繁体   English   中英

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

[英]regex to capture just filename (no url path, no extension)

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

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

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

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

另一种可能性

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

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

经测试:

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

分裂

SUBSTR

更换

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM