2013-05-10 79 views
1

我的java应用程序具有一个小命令行。为了解析参数,首先读入行,然后使用string.split("\\s+")切成一个数组。参数的格式为名称:值,通常既不是名称应该有空格。在文件路径之外的空格上拆分字符串

介绍一个新功能,当应该是一个文件路径时,我遇到了一个问题。如果路径包含空格(转义或不转义),斩波算法当然会分割路径。

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


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

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

回答

0

对于语法:/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风格的路径的阵列。生成的数组将包含文件路径而不包含的引号。

1

最好的代码是不写代码。所以,不要自己解析命令行。使用流行的图书馆之一。例如历久弥新jackarta cli project还是现代的,基于注解库args4j

+0

感谢您的链接,我以前没有听说过args4j库,这似乎是一个有趣的方法。无论我是否会走到图书馆,都会很有趣,知道是否有针对特定问题的解决方案。 – Samuel 2013-05-10 13:42:47