我試圖創建一個正則表達式來驗證我使用GridFS寫入的文件系統API的路徑名。正則表達式主要匹配字母數字路徑
我現在正則表達式^[A-Za-z0-9\-\[\]()$#_./]*$
能滿足這一條件:
- 允許
a-z
,A-Z
,0-9
,-[]()$#_./
但是它不符合這些附加標準:
- 第一字符必須是
/
- 連續不得出現多個
/
。
問題:
- 任何人可以幫助我解決我的正則表達式?
- 是否有任何可能的問題使用我的路徑名稱標準? (我錯過了什麼重要的?)
我試圖創建一個正則表達式來驗證我使用GridFS寫入的文件系統API的路徑名。正則表達式主要匹配字母數字路徑
我現在正則表達式^[A-Za-z0-9\-\[\]()$#_./]*$
能滿足這一條件:
a-z
,A-Z
,0-9
,-[]()$#_./
但是它不符合這些附加標準:
/
/
。問題:
不知道的路徑標準,但對於正則表達式,很簡單:
^\/(?!\/)([A-Za-z0-9\-\[\]()$#_.]|(\/(?!\/)))*$
\/(?!\/)
意味着斜線/
後面沒有斜槓(?!\/)
。我用了兩次,一次作爲第一個字符,並且再次作爲第一個字符之後的可能匹配之一。
似乎工作得很好,但'/'[需要被轉義](https://www.regex101.com/#javascript)就像這個'\ /'。我會盡快接受,但你應該編輯它。 – Dodekeract
實際上,如果使用文字創建RegExp對象,只需要轉義即可。如果你使用新的RegExp('/(?!/)'),你不需要任何轉義。 – Amit
真的嗎?該網站告訴我這是無效的。另外,我認爲你可以在最後加入時省略一對圓括號。 – Dodekeract
以下說明如何解決您的需求。要強制執行第一個字符/
,只需在^
之後加上即可。
^\/[A-Za-z0-9\-\[\]()$#_./]*$
爲了不讓連續斜線,你應該從你的字符集,刪除它,認爲設定爲路徑的一部分。部分將被斜線分隔。所以最終的正則表達式是:
^\/([A-Za-z0-9\-\[\]()$#_.]\/?)*$
你可能想避免..路徑以及用於/one/../two –
@SQLHacks例子是的,我想我會path.normalize是( node.js提供了一個方法來創建一個絕對路徑),謝謝你提出這個問題。 – Dodekeract