获取无法在正则表达式中读取null的属性“0”

时间:2016-08-19 09:01:50

标签: javascript regex

我想从网址获取文件名。我这样做:

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

可能是什么问题?

3 个答案:

答案 0 :(得分:2)

你的正则表达式希望带有扩展名的文件名是URL的最后一部分,而问题中的URL也有查询参数。为了将这些考虑在内,请将(?:$|\?)替换添加到前瞻:

[^\/]+(?=\.\w+(?:$|\?))

注意:捕获组是多余的,因此也将其删除。

演示:https://regex101.com/r/nX2rP5/3

答案 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]);
}