开发者问题收集

在正则表达式中无法读取 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+(?:$|\?))

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

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

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