2010-09-07 57 views
3

我有这样的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"); 
} 

我希望能够解析这些字符串并提取:

  • 命令名称(例如: create-char
  • 所需的参数(例如-name
  • 可选选项,用默认值(例如--blocking=false

我看着org.apache.commons.cli,但这似乎在第一个标准(不同的命令名称)上失败并且非常冗长。

任何图书馆的建议?

(这将被用于分析一个脚本的“语言”,如果这方面有所帮助。)

编辑:脚本语言的一个例子输入是d John "Hello World" - 多字的文字去在引号中。

+0

用于第一标准和使用org.apache.commons.cli,不能拆分在命令行上第一个空的空间? – 2010-09-07 17:40:29

回答

6

看来您希望基于其“帮助描述符”构建大量的CLI命令;各种各样的DSL。不要进行这种字符串解析,而应考虑以编程方式构建命令,其中有许多库(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()); 
    } 
} 

其他库

  • CLI
  • JewelCli:还使用注解,并允许列表和枚举值。示例看起来很有希望
  • natural-cli:允许cli带有“人类可读的货物”。似乎适合您的多个命令及其选项的目标,albiet具有不同的DSL和语法。
  • GNU Java Getopt:虽然使用命令的名称初始化Getopt对象,但使用与上面相同的方法。
  • JOpt Simple:权利要求 “简单于所有其他”
  • JArgs
  • args4j:使用注释对每个命令
  • JSAP
  • CLAJR创建单独的类:使用反射
  • CmdLn
  • ArgParser
  • JCommando:使用XML配置文件。
  • parse-cmd:使用生成器图案和方法链接建立参数
  • cli-parser:基于注解