Javascript 正则表达式只捕获文件名(无url路径,无扩展名)
在JavaScript中,我可以使用这个regexJavascript 正则表达式只捕获文件名(无url路径,无扩展名),javascript,regex,Javascript,Regex,在JavaScript中,我可以使用这个regex([^\/]+)(\.[^\.\/]+)$来捕获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:
([^\/]+)(\.[^\.\/]+)$
来捕获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文件=”http://a.com/b/filename#hash";
函数getFileName(url){
var index=url.lastIndexOf(“/”)+1;
var filenameWithExtension=url.substr(索引);
var filename=filenameWithExtension.split(“.”[0];
filename=filename.replace(/(#| \?).*?$/,“”);
返回文件名;
}
警报(getFileName(文件));
//文件名与第一个贪婪组中的点不匹配:([^\/.]+)
@JoSo:文件名中可能有点。我已经编辑了我的问题来说明这一点。如果你想要纯正则表达式,我认为你需要其他组:([^\/.]+)$|([^\/]+)(\.[^\/.]+)$
,并确定组1和组2。组3是可选的扩展。@JoSo当然!(我正在尝试替代方法,但我没有想到为完整表达式制作替代方法。)([^\/.]+)$|([^\/]+)(\.[^\/.]+)$
适合我(在第一个备选方案之后加上一个$
。如果你想回答这个问题,我可以给你打分。在http://a.com/b/filen.ame
,无法判断ame
是名称的一部分还是扩展名!!(除非您提供允许的扩展名列表)如果没有扩展名,您的第二个命题也会捕获任何查询或散列部分。请参见此处:@JamesNewton All regexen在此页面上捕获这些部分。但您可以通过在所有求反的组中包含#
和?
来避免这种情况,并且不将输入的结尾与$
匹配。或者更简单地说,只需将查询和预先散列