路徑//asdf
在LINUX,UNIX,iOS和Android上有效,因此您的代碼已可用。但是,如果由於某種原因使特定的一組有效路徑無效很重要,只需在[a-z ...]字符組之後用加號代替星號即可。這將導致無間隔字符的多路徑分隔符無效。
用正則表達式方法和細節來評論更大的問題可能很有用。
1)您可以使用[\ /]代替(\ | /),但兩者都會允許在操作系統和文件系統的每個組合上出現誤報。 (那些需要正斜槓的應該排除反斜槓作爲分隔符,反之亦然。)
2)字符範圍[a-zA-Z0-9 \ s -_ \ @ - \ ^!#$%&] in問題不在於操作系統和文件系統的任何已知組合的目錄路徑元素的允許字符範圍。例如,對於大多數目錄名稱,句點是有效的。
3)允許的字符範圍不可移植。 (測試路徑驗證的最可靠方法是觸摸實際文件系統上的文件名,意思是實例化一個空文件並捕獲實例化失敗的任何跡象。)
4)您不需要或不需要星號之後或第二個(\ | /)組後面的問號。他們不會創建錯誤,但是他們會浪費編譯或運行時間,並且會混淆正則表達式的用途。
5)您還需要在擴展名之前重複字符範圍或重新排列,如下例所示。
6)如果您在正則表達式的末尾使用\ i作爲標誌,則不需要將A-Z範圍添加到a-z範圍。
7)從期望的結果列表中可以看出,要濾除相對路徑,但沒有明確提及該解決方案的規則。
猶豫不決,此代碼僅用於演示上述幾項改進。
// This code is not production worthy
// for reasons (1) through (3) given
// above and is provided only for the
// purpose of clarifying points made.
var re = /^([\\/][a-z0-9\s\-_\@\-\^!#$%&]*)+(\.[a-z][a-z0-9]+)?$/i
console.log(
[
'/',
'/asdf',
'/asdf/scd.csv',
'//asdf',
'/asd/ads/c.csv/',
'asd/asfd/a'
].map(RegExp.prototype.test, re))