2017-03-24 96 views
2

我正在嘗試爲文件和目錄路徑驗證創建一個regEx。 我已經實現了這一點,但其失敗的條件之一,它不應該允許即多個斜線在一起。 此外,沒有其它特殊字符不應該被允許文件和目錄正則表達式

var x = /^(\\|\/){1}([a-zA-Z0-9\s\-_\@\-\^!#$%&]*?(\\|\/)?)+(\.[a-z\/\/]+)?$/i 
  • 試驗1 - > /(應該傳遞)
  • 試驗2 - >/ASDF(應該傳遞)
  • 試驗3 - >/ASDF/scd.csv(應該傳遞)
  • 試驗4 - > // ASDF(失敗,目前合格)
  • 試驗5 - > /asd/ads/c.csv/(應該傳遞)
  • 測試6 - > asd/asfd/a(應該失敗)

建議如何解決這個問題?

回答

1

路徑//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))

0

嘗試使用/^(\/|([\\/][\w\[email protected]^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i代替,這迫使至少一個字符的每個之間匹配斜線:

var regex = /^(\/|([\\/][\w\[email protected]^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i 
 

 
console.log([ 
 
    '/', 
 
    '/asdf', 
 
    '/asdf/scd.csv', 
 
    '//asdf', 
 
    '/asd/ads/c.csv/', 
 
    'asd/asfd/a' 
 
].map(RegExp.prototype.test, regex))

0
((\/[\w\s\[email protected]^!#$%&-]+)+\/?)|\/[\w\.\[email protected]^!#$%&-]* 

這被測試以匹配你的樣本輸入,在np ++上(即,在np ++上)與
但是匹配。 perl-regex味道),因爲我沒有使用JavaScript的經驗。
因此,在這裏風味獨立散文相同。

「(斜線和字符多次,隨後可選的斜線)

斜線和零個或多個字符」。

注1:我添加了明確的「。」。允許的字符。注2:我假設你的「\ /」意思是「明確的斜槓,而不是反斜槓」。

相關問題