我想从网址获取文件名。我这样做:
console.log(url)
const filename = url.match(/([^\/]+)(?=\.\w+$)/)[0]
return filename
但我得TypeError: Cannot read property '0' of null
。这很奇怪,因为console.log(url)
会输出file: http://ac-0uhksb6K.clouddn.com/9710016c8dfcf6ae1e9d.jpg?imageView2/2/w/4096/h/2048/q/100/format/jpg
可能是什么问题?
答案 0 :(得分:2)
你的正则表达式希望带有扩展名的文件名是URL的最后一部分,而问题中的URL也有查询参数。为了将这些考虑在内,请将(?:$|\?)
替换添加到前瞻:
[^\/]+(?=\.\w+(?:$|\?))
注意:捕获组是多余的,因此也将其删除。
答案 1 :(得分:1)
如果没有匹配项,则没有数组可以选择[0]的第一项。
您想要检查数组是否至少有一个项目......
答案 2 :(得分:1)
发生错误是因为没有匹配项,请参阅your regex demo。问题是,在字符串(?=\.\w+$)
结束之前,前瞻.
需要1 or more word chars
+ $
。您还需要允许检查?
查询字符串开始标记。
注意您实际上根本不需要使用外观。使用捕获组 - ([^\/]+)\.\w+(?:\?|$)
并访问[1]
项。
请参阅regex demo
此外,在访问捕获组之前,最好先检查是否发生了匹配。
var re = /([^\/]+)\.\w+(?:\?|$)/;
var str = 'file: http://ac-0uhksb6K.clouddn.com/9710016c8dfcf6ae1e9d.jpg?imageView2/2/w/4096/h/2048/q/100/format/jpg';
var match = str.match(re);
if (match) {
console.log(match[1]);
}