Java 定义同时具有强制和可选参数的选项

Java 定义同时具有强制和可选参数的选项,java,command-line-arguments,apache-commons-cli,Java,Command Line Arguments,Apache Commons Cli,我目前正试图找到一种方法来构建一个命令行选项,当提供该选项时,它可以接受一个必需参数或第二个可选参数(除了必需参数之外)。我正试图使用ApacheCommonsCLI实现这一点 i、 e.myProgram-a[整数] myProgram -a "test" --> isValid myProgram -a "test" 2 --> also isValid 我试过: Option.builder(“a”).hasArg().numberOfArgs(2).optionalArg(

我目前正试图找到一种方法来构建一个命令行选项,当提供该选项时,它可以接受一个必需参数或第二个可选参数(除了必需参数之外)。我正试图使用ApacheCommonsCLI实现这一点

i、 e.myProgram-a[整数]

myProgram -a "test" --> isValid
myProgram -a "test" 2 --> also isValid
我试过:
Option.builder(“a”).hasArg().numberOfArgs(2).optionalArg(true.build()

&

Option.builder(“a”).hasArg().numberOfArgs(2.build()

两者都没有达到预期效果。第一个示例使两个参数都是可选的,它允许传递不符合要求的空参数

第二个示例要求这两个参数,但仅提供字符串类型arg时失败

我已经看过了commons cli的文档,但是他们提供的用例没有涉及像这样复杂的用例,同样也没有从api文档中获得太多细节


当-a没有提供值时,我预计程序会失败,但当提供1个或2个参数时,程序会成功,如前所示。

根据我对appache commons cli文档的理解(我可能是错的),似乎没有办法按每个参数设置“optionalArg”

我在示例中也看到了它的用法,它似乎接受了中间带有分隔符的参数,如
-D=
而不是空格?但我不确定这一点

但是,是的,为了满足您的需要,您可以直接使用它并允许可选参数,然后在该选项没有所需参数时拒绝它(我知道这会破坏使用commons cli的目的)

编辑:是否尝试使用?这个例子引起了我的兴趣:

例如,以下命令允许命令行标志为“-v-p” 字符串值-f/dir/file'。感叹号位于强制符号之前 选择权

 Options options = PatternOptionBuilder.parsePattern("vp:!f/");

它说感叹号可以在强制选项之前使用,但我不确定它是否可以与强制参数一起使用?但是我没有尝试过。

根据我对appache commons cli文档的理解(我可能错了),似乎没有一种方法可以在每个参数的基础上设置“optionalArg”

我在示例中也看到了它的用法,它似乎接受了中间带有分隔符的参数,如
-D=
而不是空格?但我不确定这一点

但是,是的,为了满足您的需要,您可以直接使用它并允许可选参数,然后在该选项没有所需参数时拒绝它(我知道这会破坏使用commons cli的目的)

编辑:是否尝试使用?这个例子引起了我的兴趣:

例如,以下命令允许命令行标志为“-v-p” 字符串值-f/dir/file'。感叹号位于强制符号之前 选择权

 Options options = PatternOptionBuilder.parsePattern("vp:!f/");

它说感叹号可以在强制选项之前使用,但我不确定它是否可以与强制参数一起使用?不过我没有尝试过。

在过去,在这种情况下,我添加了第二个选项。在你的例子中,-b

-b [bvalue]   If -a is enabled, ensure that it uses bvalue to thinginate.
如果第二个(可选)值用作标志,则它可以只是一个布尔标志

如果第二个(可选)值是任意输入,则第二个选项可以接受一个必需的参数


虽然我确信您有理由将参数组织为
-reqdval optval
,但它通常会导致一个更有用的命令行,即无论如何不具有这些多层可选性(即在一个选项中存在第二位可选值)。您可以将其视为两级和三级嵌套菜单之间的UX差异。由于项目数量有限,两级菜单通常更有用。(没有更具体的用例细节,答案只能是笼统的。)

过去,在这种情况下,我添加了第二个选项。在你的例子中,-b

-b [bvalue]   If -a is enabled, ensure that it uses bvalue to thinginate.
如果第二个(可选)值用作标志,则它可以只是一个布尔标志

如果第二个(可选)值是任意输入,则第二个选项可以接受一个必需的参数


虽然我确信您有理由将参数组织为
-reqdval optval
,但它通常会导致一个更有用的命令行,即无论如何不具有这些多层可选性(即在一个选项中存在第二位可选值)。您可以将其视为两级和三级嵌套菜单之间的UX差异。由于项目数量有限,两级菜单通常更有用。(没有更具体的用例细节,答案必须是一般性的。)

那么您有一个选项可以提供零次或一次,并且可以有一个或两个值

final Options=new Options()
.addOption(Option.builder(“a”).hasArg().hasArgs().build());
CommandLine cmd=new DefaultParser().parse(选项,参数);
LOG.debug(Arrays.asList(args.toString()+):“+Arrays.asList(cmd.getOptionValues(“a”)).toString());
当提供的参数太多或太少时,您可能希望引发自己的解析异常


如果您想多次提供
-a
,请查看此答案:

那么您有一个选项可以提供零次或一次,并且可以有一个或两个值

final Options=new Options()
.addOption(Option.builder(“a”).hasArg().hasArgs().build());
CommandLine cmd=new DefaultParser().parse(选项,参数);
LOG.debug(Arrays.asList(args.toString()+):“+Arrays.asList(cmd.getOptionValues(“a”)).toString());
当提供的参数太多或太少时,您可能希望引发自己的解析异常


如果你想多次提供
-a
,请看这个答案:

脏是我现在正在尝试的,但到目前为止还不太好