2012-01-03 81 views
0

我正在編寫一個函數,它接收一個預期的文件名並進行驗證,以確保文件名中不存在任何系統不允許的字符。這些是不允許的字符:/ \ | *? 「<>編寫一個包含特殊保留字符的Javascript正則表達式

我明顯可以使用string.indexOf()逐個搜索每個特殊字符,但這比僅使用string.search()使用正則表達式查找要長很多文件名中的任何字符

問題是,大多數這些字符被認爲是描述正則表達式的一部分,所以我不確定如何將這些字符包含爲真正屬於正則表達式本身的一部分。例如,Javascript正則表達式中的/字符告訴Javascript它是正則表達式的開始或結束。如何編寫一個JS正則表達式,其功能如下:filename.search(\ OR/OR | OR * OR?OR 「OR < OR>)

+0

因此,「我如何在正則表達式中轉義字符?「任何文檔都應該在第一頁或第二頁上解釋這一點 – 2012-01-03 17:03:46

+1

我不會擔心文件名中不需要的東西,除非你將像'(。+)\。ext'這樣的細節和概括混合在一起。專注於像'^ \ w +(?:\。\ w +)* \。\ w {2,4} $這樣允許的內容''這個[[\ \/\\ | *?「<>]'匹配的集合是imense。 – sln 2012-01-03 17:49:43

回答

1

把你的東西在character class像這樣:

[/\\|*?"<>] 

你會不得不逃離反斜槓,但其他字符失去其特殊的意義。此外,在這種情況下,RegExp的test()方法比String.search更合適。

filenameIsInvalid = /[/\\|*?"<>]/.test(filename); 
+0

'/ [/ \\ | *?「<>] /'可能會產生錯誤,因爲delimeter' /'不會被轉義,而且這不是負面的字符類,如果它們存在,filenameIsValid是不是TRUE? – sln 2012-01-03 17:33:25

+0

正如我所說的,'/'字符在字符類中失去了它的特殊含義,所以這裏沒有錯誤,你誤讀了變量名:我稱它爲'filenameIsInvalid',所以它確實是'真的':) – user123444555621 2012-01-03 19:01:49

+0

' /'在正則表達式中沒有* special *含義,不管它在哪裏,它都必須是一個智能解析器,它已經知道包含內部的定界符,所有其他解析器會生成一條消息,如'試圖分析正則表達式' '/ [/' - >'\\ | *?「<>] /'。 – sln 2012-01-03 19:40:41

0

您需要轉義特殊字符。在JavaScript中,這是通過使用\(反斜槓)字符完成的。

但是,我建議使用類似xregexp的東西,如果你想匹配字符串文字(這是JavaScript本地正則表達式支持缺乏的東西),它將爲你處理轉義。

0

正則表達式的正確的語法是:

/^[^\/\\|\*\?"<>]+$/ 

[^將匹配任何東西,但畢竟是[^]組匹配的東西將返回匹配的null。因此檢查驗證是匹配null

演示:jsFiddle。演示#2:Comparing against null

第一個字符串是有效的;第二個是無效的,因此null

但顯然,您需要轉義匹配中使用的正則表達式字符。爲了逃避用於正則表達式的字符,需要在字符之前有一個反斜槓,例如\*,\/,\$,\?

+0

「你需要轉義正則表達式字符」。不,你沒有。 – user123444555621 2012-01-03 17:16:16

相關問題