在 Java 中将包含命令行参数的字符串拆分为 String[]

2022-09-01 09:40:25

C#的这个线程类似,我需要将包含命令行参数的字符串拆分到我的程序中,以便我可以允许用户轻松运行多个命令。例如,我可能有以下字符串:

-p /path -d "here's my description" --verbose other args

鉴于上述情况,Java通常会将以下内容传递给main:

Array[0] = -p
Array[1] = /path
Array[2] = -d
Array[3] = here's my description
Array[4] = --verbose
Array[5] = other
Array[6] = args

我不需要担心任何shell扩展,但它必须足够智能,以处理单引号和双引号以及字符串中可能存在的任何转义。有没有人知道一种方法来解析字符串,就像shell在这些情况下一样?

注意:我不需要做命令行解析,我已经在使用joptsimple来做到这一点。相反,我想让我的程序易于编写脚本。例如,我希望用户能够在单个文件中放置一组命令,每个命令在命令行上都是有效的。例如,他们可能会在文件中键入以下内容:

--addUser admin --password Admin --roles administrator,editor,reviewer,auditor
--addUser editor --password Editor --roles editor
--addUser reviewer --password Reviewer --roles reviewer
--addUser auditor --password Auditor --roles auditor

然后,用户将按如下方式运行我的管理工具:

adminTool --script /path/to/above/file

main()然后找到该选项并循环访问文件中的不同行,将每行拆分为一个数组,然后我会在一个joptsimple实例上触发该数组,然后将其传递到我的应用程序驱动程序中。--script

joptsimple附带了一个具有解析方法的解析器,但它只支持数组。类似地,GetOpt 构造函数也需要一个 -- 因此需要一个解析器。StringString[]


答案 1

下面是将文本行从文件拆分为参数向量的非常简单的替代方法,以便您可以将其馈送到选项解析器中:

这是解决方案:

public static void main(String[] args) {
    String myArgs[] = Commandline.translateCommandline("-a hello -b world -c \"Hello world\"");
    for (String arg:myArgs)
        System.out.println(arg);
}

魔法类命令线蚂蚁的一部分。因此,您要么必须将 ant 放在类路径上,要么只采用 Commandline 类,因为使用的方法都是静态的。


答案 2

如果您只需要支持类UNIX操作系统,那么有一个更好的解决方案。与蚂蚁不同,DrJava的ArgumentTokenizer更像是:它支持转义!Commandlinesh

说真的,即使是像疯狂的东西也会被正确地标记成(顺便说一句,当运行时,这个命令输出)。sh -c 'echo "\"un'\''kno\"wn\$\$\$'\'' with \$\"\$\$. \"zzz\""'[bash, -c, echo "\"un'kno\"wn\$\$\$' with \$\"\$\$. \"zzz\""]"un'kno"wn$$$' with $"$$. "zzz"