2014-02-23 34 views
3

對於一個Web應用程序,我試圖想出一個JavaScript正則表達式,它匹配任何不以.json結尾的內容。聽起來很簡單,但我很難找到它。Regex匹配任何不以.json結尾的文件

我首先想這樣做:^.*(?!\.json$),但顯然沒有工作,因爲它只是匹配整個字符串。然後我嘗試^[^\.]*(?!\.json$),但匹配abc.json中的ab

我已經找到了兩個可以完成這個工作的正則表達式,但我想要一個正則表達式可以做到這一點。

// Match anything that has a dot but does not end in .json 
^.*\.(?!json$) 
// Match anything that doesn't have a dot 
^[^\.]*$ 

我喜歡http://regex101.com/#javascript來測試它們。

我在app.get(REGEXP, routes.index)中使用正則表達式作爲ExpressJS路由定義的一部分。

回答

5

嘗試/^(?!.*\.json$).*$/

/^(?!.*\.json$).*$/.test("foo.json") 
false 
/^(?!.*\.json$).*$/.test("foo") 
true 
/^(?!.*\.json$).*$/.test("foo.html") 
true 
+0

哇,這麼閃電快速回覆文件擴展名。這工作完美!太感謝了! –

+0

@TheFonz:你應該考慮另外兩個答案中的其他選項。有關代碼可讀性的完美有效的觀點。 – hayavuk

+0

請標記爲正確的答案,然後:) –

0

的可能,而不是測試 「比賽(不以.json)」 你可以測試 「不匹配(以.json)」,這是很容易?

+0

感謝您的答案,我會這樣做,如果我不想使用Express.js的'app.get(REGEX,routes.index);' –

+0

@TheFonz:糾正我,如果我錯了,但你不能讓擴展名爲可選參數,並測試它是否'.json'?編輯:例如'/ foo(\。\ w +)?/' – hayavuk

+0

是的,但我不確定這將如何與上面的註釋中的函數一起工作......使用正則表達式更容易。此外,文件名可以是任何東西。 –

0

我想創建一個正則表達式匹配以.json,然後當你檢查它的反向邏輯與

比賽==假

這將是更簡單,它說明了什麼你正試圖讓其他程序員變得更加明顯。

+0

不知道爲什麼這是downvoted,但這是一個非常合理的解決方案。這不是嚴格的正則表達式,但它是有效的。 – hayavuk

+0

除非他們的問題只是他們需要的更大的正則表達式的一部分 - 例如,也許他們需要匹配部分文件名以便以後抽取;如果你只匹配它擊中JSON然後否認它,你不能合併這些。有了負面的預測,你可以。 –

+1

感謝您的評論。不能這麼做,我使用Express.js並想使用'app.get(REGEX,routes.index);'語法 –

1

你總是可以得到文件擴展名,然後比較它。

正則表達式來查找文件擴展名

/\.[^.]*$/

獲得與

var extension = /\.[^.]*$/.exec("something.json"); 

if(extension[0] === ".json"){ 
    //do something 
} 
+0

好點。優雅的解決方肯定會考慮如果我不使用Express.js的'app.get(REGEX,routes.index);'語法。 –

+0

哦,那改變了事情。好吧,我想我會在這裏與其他答案一起去 – powerc9000

相關問題