在正则表达式中无法读取 null 的属性“0”
2016-08-19
2553
我想从 URL 获取文件名。我正在这样做:
console.log(url)
const filename = url.match(/([^\/]+)(?=\.\w+$)/)[0]
return filename
但我收到
TypeError:无法读取 null 的属性“0”
。这很奇怪,因为
console.log(url)
输出
文件:http://ac-0uhksb6K.clouddn.com/9710016c8dfcf6ae1e9d.jpg?imageView2/2/w/4096/h/2048/q/100/format/jpg
可能是什么问题?
3个回答
您的正则表达式要求文件名及其扩展名是 URL 的最后一部分,而问题中的 URL 也包含查询参数。为了考虑到这些因素,请将
(?:$|\?)
替换添加到前瞻中:
[^\/]+(?=\.\w+(?:$|\?))
注意:捕获组是多余的,因此也将其删除。
Dmitry Egorov
2016-08-19
如果没有匹配项,则不存在可用来使用 [0] 选择第一个项目的数组。
您需要先检查数组是否至少有一个项目...
benjaminhull
2016-08-19
错误发生是因为没有匹配,请参阅
您的正则表达式演示
。问题是前瞻
(?=\.\w+$)
需要
.
+
1 或更多单词字符
在字符串结尾
$
之前。您还需要允许检查
?
查询字符串开始标记。
请注意
,您实际上根本不需要使用环视。使用捕获组 -
([^\/]+)\.\w+(?:\?|$)
并访问
[1]
项。
查看 正则表达式演示
此外,在访问捕获组之前检查是否发生匹配始终是一个好主意。
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]);
}
Wiktor Stribiżew
2016-08-19