2016-08-19 27 views
0

我想從url中獲取文件名。我這樣做:獲取無法讀取正則表達式中null的屬性'0'

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

有什麼問題?

+2

沒有比賽,看到https://regex101.com/r/nX2rP5/1。檢查匹配是否爲空。嘗試'([^ \ /] +)\。\ w +(?:\?| $)'並訪問'[1]'項目。 –

+0

@WiktorStribiżew你是對的!你可以發佈這個答案嗎? – alexchenco

回答

2

你的正則表達式預計其擴展名的文件名是一個URL的最後一部分,而在問題的URL也具有查詢參數。爲了考慮這些因素加(?:$|\?)交替的前瞻:

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

注:捕獲組是多餘的,以便去除它。

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

+0

在這種情況下,您有一個冗餘捕獲組。爲什麼要同時使用,圍繞整個消費模式捕捉羣組以及環視? –

+0

是的,你說得對。只是對OP的表達做了最小的改變。修復帖子... –

1

如果沒有匹配,則沒有數組可以用[0]選擇第一個項目。發生

你要檢查陣列具有至少一個項目的第一...

1

的錯誤,因爲沒有匹配,見your regex demo。問題是前瞻(?=\.\w+$)需要字符串$結束之前的. + 1 or more word chars。您還需要允許檢查?查詢字符串開始標記。

注意你實際上不必使用lookarounds。使用捕獲組 - ([^\/]+)\.\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]); 
 
}

相關問題