【问题标题】:Split string on spaces except file paths在除文件路径之外的空格上拆分字符串
【发布时间】:2013-05-10 13:26:52
【问题描述】:

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

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

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


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

如果更简单的string.split(" ") 也可以接受。

【问题讨论】:

    标签: java regex parsing command-line-interface


    【解决方案1】:

    最好的代码不是写出来的代码。所以,不要自己解析命令行。使用流行的库之一。例如古老的 jackarta cli project 或现代的、基于注释的库 args4j

    【讨论】:

    • 感谢链接,我之前没有听说过 args4j 库,这似乎是一个有趣的方法。不管我是否会去图书馆,知道是否有针对特定问题的解决方案会很有趣。
    【解决方案2】:

    对于语法:/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 样式的路径。结果数组将包含文件路径没有引号。

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2015-02-15
      • 2015-11-09
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2014-02-15
      相关资源
      最近更新 更多