在 Java 中使用正規表示式驗證 Linux 資料夾路徑
1. 概述
在 Java 中使用檔案系統時,驗證資料夾路徑對於確保我們的應用程式正確且安全地運行至關重要。執行路徑驗證的一種有效方法是使用正規表示式 (regex)。
在本教程中,我們將探討如何使用 Java 中的正規表示式來驗證 Linux 資料夾路徑,確保我們使用的路徑符合預期的模式和約定。
2.問題介紹
在應用程式中實作 Linux 目錄路徑時,我們通常需要遵循特定的要求,而不是接受特定 Linux 檔案系統(例如 ext4)的所有有效路徑。
舉個例子,假設我們應用程式中的 Linux 目錄String
必須通過以下檢查:
- 目錄路徑不能為空。
- 該路徑必須是絕對路徑。換句話說,它必須以斜線字元(/)開頭;不允許使用
./foo
和../foo
等相對路徑。 - 除斜線外,絕對路徑只能包含破折號(-)、底線(_)、數字、大小寫字母。
- 目錄路徑不得以斜線字元結尾。例如,我們認為“/foo/bar/”是無效路徑。但有一個且只有一個例外:根目錄“/”是允許的。
值得注意的是,我們的驗證並不是為了檢查目前檔案系統中是否存在給定的目錄路徑。如果需要檢查檔案或目錄是否存在,則正規表示式可能不是執行此任務的正確工具。
接下來,讓我們看看如何建立正規表示式模式來滿足驗證規則。
3. 建立正規表示式模式
乍一看,建立滿足所有要求的正規表示式模式似乎很複雜。接下來,讓我們一起逐步製作正規表示式模式,我們會發現這不是一項具有挑戰性的任務。
首先,由於有效路徑始終以斜線字元開頭,並且僅允許使用破折號 (-)、下劃線 (_)、數字以及小寫和大寫字母,因此我們可以建立以下正規表示式模式以:「 ^/[0-9a-zA-Z_-]+$
“。字元類別[0-9a-zA-Z_]
符合單字字元。在正規表示式中, **\w 是單字 字元類別 的簡寫字元類別**。因此,我們可以替換“ 0-9a-zA-Z_
” 使用“\w”使模式更簡單且易於閱讀:“ ^/[\\w-]+$
”。
目前模式僅符合頂級目錄,例如“ /foo
”和“ /123
”。然而,一個目錄可能包含多層子目錄,例如“ /foo/sub1/sub2/sub3
”。
如果我們仔細檢查這個路徑,我們會發現一個包含子目錄的有效路徑是由多個目錄String
組成的。例如,「 /foo/sub1/sub2/sub3
」包含與我們的頂級目錄模式相符的四個段落:「 /foo
」、「 /sub1
」、「 /sub2
」和「 /sub3
」。
因此,為了匹配多個連續目錄,我們可以將頂級目錄模式放入捕獲組中,並將“+”量詞添加到該組中:“ ^(/[\\w-]+)+$
” 。
此模式將匹配幾乎所有目錄路徑。我們快到了。但是,此模式未涵蓋一種特殊情況:根目錄“/”。匹配“/”的模式是“ ^/$
”。我們可以使用「OR」運算子 (|) 合併這兩種模式來匹配這兩種情況。所以,我們有:「 ^/|(/[\\w-]+)+$
」。
接下來,讓我們測試一下該模式是否如預期般運作。
AssertJ 函式庫允許我們在測試中編寫流暢的斷言語句。此外,它還提供了許多方便的方法來輕鬆驗證測試結果。例如,我們可以使用它的matches()
和doesNotMatch()
方法來驗證測試中的正規表示式模式匹配:
String regex = "^/|(/[\\w-]+)+$";
assertThat("/").matches(regex);
assertThat("/foo").matches(regex);
assertThat("/foo/0").matches(regex);
assertThat("/foo/0/bar").matches(regex);
assertThat("/f_o_o/-/bar").matches(regex);
assertThat("").doesNotMatch(regex);
assertThat(" ").doesNotMatch(regex);
assertThat("foo").doesNotMatch(regex);
assertThat("/foo/").doesNotMatch(regex);
assertThat("/foo/bar/").doesNotMatch(regex);
assertThat("/fo o/bar").doesNotMatch(regex);
assertThat("/foo/b@ar").doesNotMatch(regex);
如同上面的測試所示,我們的正規表示式模式通過了正面和負面測試。因此,使用此正規表示式模式的驗證器符合要求。
4。
在 Java 中使用正規表示式驗證 Linux 資料夾路徑是一種強大的技術,可確保它們符合預期模式。
使用本文介紹的技術,我們可以自信地處理 Java 專案中的 Linux 路徑,從而產生更具彈性和可維護性的程式碼。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。