在文件路径以外的空格上拆分字符串

时间:2013-05-10 13:26:53

标签: java regex parsing command-line-interface

我的java应用程序具有一个小命令行。为了解析参数,首先读入行,然后使用string.split("\\s+")将其切割成数组。参数的格式为 name:value ,通常 name value 都不应该包含空格。

引入新功能当 value 应该是文件路径时,我遇到了问题。如果路径包含空格(转义或不转义),则斩波算法当然只是分开路径。

问:正则表达式允许我将字符串拆分为参数数组而不拆分(转义)文件路径。

<小时/> 我认为转义路径的格式为/folder/part1\ part2.txt,但合理的替代语法也是有效的。

如果更容易string.split(" ")也可以接受。

2 个答案:

答案 0 :(得分:1)

最好的代码不是代码。所以,不要自己解析命令行。使用一个流行的图书馆。例如,旧的jackarta cli project或现代的基于注释的库args4j

答案 1 :(得分:0)

语法:/folder/part1\ part2.txt

要解决此问题的正则表达式需要负面后瞻,以检查我们正在寻找的模式之前的字符是否不是\。正则表达式为(?<!\\)\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样式路径。生成的数组将包含文件路径,不带引号。