Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式只捕获文件名(无url路径,无扩展名)_Javascript_Regex - Fatal编程技术网

Javascript 正则表达式只捕获文件名(无url路径,无扩展名)

Javascript 正则表达式只捕获文件名(无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:

在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://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在此页面上捕获这些部分。但您可以通过在所有求反的组中包含
#
来避免这种情况,并且不将输入的结尾与
$
匹配。或者更简单地说,只需将查询和预先散列