Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分析字符串,就像它是一个带有参数和选项的命令一样_Java_Command Line_Command Line Arguments - Fatal编程技术网

Java 分析字符串,就像它是一个带有参数和选项的命令一样

Java 分析字符串,就像它是一个带有参数和选项的命令一样,java,command-line,command-line-arguments,Java,Command Line,Command Line Arguments,我有一个Java枚举: public enum Commands { RESIZE_WINDOW("size -size"), CREATE_CHARACTER("create-char -name"), NEW_SCENE("scene -image"), DIALOG("d -who -words"), PLAY_SOUND("sound -file --blocking=false"), FADE_TO("fade-to -file"),

我有一个Java枚举:

public enum Commands
{
    RESIZE_WINDOW("size -size"),
    CREATE_CHARACTER("create-char -name"),
    NEW_SCENE("scene -image"),
    DIALOG("d -who -words"),
    PLAY_SOUND("sound -file --blocking=false"),
    FADE_TO("fade-to -file"),
    WAIT("w -length=auto");
}
我希望能够解析这些字符串并提取:

  • 命令名(例如,
    创建字符
  • 所需参数(例如
    -name
  • 可选选项,带有默认值(例如
    --blocking=false
我查看了,但在第一个条件(不同的命令名)上似乎失败了,而且非常冗长

有图书馆的建议吗

(如果上下文有帮助,这将用于解析脚本“语言”。)


编辑:脚本语言中的一个示例输入是
d John“Hello World”
——多单词文本用引号括起来。

您似乎希望仅基于其“帮助描述符”构建大量CLI命令;一种。不要进行这种字符串解析,而是考虑以编程方式构建命令,其中有许多库(CLI只有一个)和优点。

您的示例已经非常复杂,需要再次查看CLI(或其他任何一个)。显示必需的和可选的参数,每个参数要么没有值,要么有默认值(尽管在没有默认值、命令描述等的情况下无法指示“必需的”参数值),并且仍然需要为命令行本身、验证、调用处理程序的方法等构建解析器

下面是我找到的命令解析器列表。没有人会解析您的特定DSL,但它们允许您以编程方式构建命令、解析命令、经常验证并提供有意义的警告、帮助处理等。有些人甚至使用对象上的注释来定义命令,理论上使维护更容易

大多数设计(并显示示例)用于解析程序的参数,而不是大量命令(natural cli是一个例外),但所有这些都应该能够做到这一点-一个简单的类可以将解析和选项打包在一起:

static class CommandLine {
    HashMap<String,Options> options = new HashMap<String,Options>();

    public void register(String cmd, Options opts) {
        options.put(cmd, opts);
    }

    public void parse(String line) {
        // a better parser here would handle quoted strings
        String[] split = line.split("\\s");

        String cmd = split[0];
        String[] args = new String[split.length-1];
        if (args.length > 0)
            System.arraycopy(split, 1, args, 0, args.length);

        Options opts = options.get(cmd);
        if (opts == null) 
            ; // handle unknown command
        else {
            opts.parse(args);
            // handle results...
            opts.reset(); // required?
        }
    }
}

public static void main(String[] args) throws Exception {

    CommandLine cl = new CommandLine();
    cl.register("size", new Options());        // This will vary based on library Some
    cl.register("create-char", new Options()); // require subclasses, others use builder
    //...                                         pattern, or other means.

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
        cl.parse(in.readLine());
    }
}
静态类命令行{
HashMap选项=新建HashMap();
公共无效寄存器(字符串cmd,选项opts){
期权.put(cmd,opts);
}
公共void解析(字符串行){
//这里更好的解析器可以处理带引号的字符串
String[]split=line.split(\\s”);
字符串cmd=split[0];
字符串[]args=新字符串[split.length-1];
如果(args.length>0)
System.arraycopy(拆分,1,参数,0,参数长度);
Options opts=Options.get(cmd);
if(opts==null)
;//处理未知命令
否则{
opts.parse(args);
//处理结果。。。
opts.reset();//是否需要?
}
}
}
公共静态void main(字符串[]args)引发异常{
命令行cl=新命令行();
cl.register(“size”,new Options());//这将根据库的不同而有所不同
cl.register(“create char”,new Options());//需要子类,其他使用生成器
//…模式或其他方式。
BufferedReader in=新的BufferedReader(新的InputStreamReader(System.in));
while(true){
cl.parse(in.readLine());
}
}
其他库

  • :还使用注释,并允许值的列表和枚举。例子看起来很有希望
  • :允许cli使用“人类可读语句”。似乎是为了实现多个命令及其选项的目标,albiet使用了不同的DSL和语法
  • :使用与上面相同的方法,尽管使用命令名初始化Getopt对象
  • :声称“简单胜过一切”
  • :在为每个命令创建的单独类上使用注释
  • :使用反射
  • :使用XML配置文件
  • :使用生成器模式和方法链接生成参数
  • :基于注释

对于第一个条件,使用org.apache.commons.cli,您不能在第一个空白处拆分命令行吗?