【发布时间】:2015-05-03 22:19:49
【问题描述】:
在 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 的后面。
【问题讨论】:
-
只是不要匹配第一个贪婪组中的点:
([^\/.]+) -
@JoSo:文件名中可能有圆点。我已经编辑了我的问题以明确这一点。
-
那么,如果您想要纯正则表达式,我认为您需要替代组:
([^\/.]+)$|([^\/]+)(\.[^\/.]+)$并识别组 1 和 2。组 3 是可选扩展。 -
@JoSo 当然! (我正在尝试替代方案,但我没想过为完整的表达式做一个替代方案。)
([^\/.]+)$|([^\/]+)(\.[^\/.]+)$为我工作(在第一个替代方案之后有一个$。如果你想给出这个答案,我可以给你积分。 -
在
http://a.com/b/filen.ame中,无法判断ame是名称的一部分还是扩展名! (除非您提供允许的扩展名列表)
标签: javascript regex