對於語法:/folder/part1\ part2.txt
:
正則表達式來解決這個問題需要一個負向後看,檢查是否之前的字符我們正在尋找的模式不是\
。正則表達式將是(?<!\\)\s+
:(?<!\\)
是後面的部分,\\
是我們不想看到的模式。 \s+
是我們正在尋找的模式 - 某種空間。要在java中使用這個正則表達式,你必須正確地轉義它,如:string.split("(?<!\\\\)\\s+")
。
這適用於UNIX樣式的文件路徑,例如,如果您想將文件傳遞到,則可能必須刪除反斜槓。
有關語法
"/folder/part1 part2.txt"
:
這可能是一個比較普遍的做法,但是引入了額外的工作。這個想法是循環遍歷字符串,每次我們看到一個空間時,我們都會將前一部分保存到一個列表中,除非空格在轉義部分。例如:
List<String> parts = new ArrayList<String>();
boolean escaped = false;
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if(!escaped && (c == ' ' || c == '\t')) { // Space in non-escaped part
parts.add(stringBuilder.toString()); // Put buffer in list
stringBuilder = new StringBuilder();
} else if (c == '"') // Escape sign
escaped = !escaped; // Toggle escape status
else
stringBuilder.append(c); // Add char to buffer
}
parts.add(stringBuilder.toString()); // Put the last buffer into the array
如果必要的列表可以被轉換爲使用
String[] args = parts.toArray(new String[parts.size()])
此格式允許UNIX和Windows風格的路徑的陣列。生成的數組將包含文件路徑而不包含的引號。
感謝您的鏈接,我以前沒有聽說過args4j庫,這似乎是一個有趣的方法。無論我是否會走到圖書館,都會很有趣,知道是否有針對特定問題的解決方案。 – Samuel 2013-05-10 13:42:47