[英]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
参考文献:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.