对于语法/folder/part1\ part2.txt
::
解决这个问题的正则表达式需要一个否定的look-behind,以检查我们正在寻找的模式之前的字符是否不是\
. 正则表达式是(?<!\\)\s+
:(?<!\\)
是后面的部分,\\
是我们不想看到的模式。\s+
是我们正在寻找的模式——某种空间。要在 java 中使用这个正则表达式,你必须正确地转义它,如:string.split("(?<!\\\\)\\s+")
.
这适用于 UNIX 样式的文件路径,如果要将文件传递new File()
给例如,则可能必须删除反斜杠。
对于语法
"/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 样式的路径。结果数组将包含不带引号的文件路径。