首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“智能地”解析用户输入参数

“智能地”解析用户输入参数
EN

Stack Overflow用户
提问于 2013-08-23 21:30:46
回答 2查看 1.5K关注 0票数 1

我有一个通过Runtime.getRuntime().exec(cmdArray[])执行命令的程序。用户可以通过在文本框中输入命令来将其他开关附加到这些命令。

示例:

代码语言:javascript
复制
cmdArray[] = {"someprogram", "--something", "123"} //this is the initial command
//textbox is   -A "bla bla bla"   notice the quotes

//do something...

cmdArray[] = {"someprogram", "--something", "123", "-A", "bla bla bla"} //parsed array

有没有一个java函数可以让我这样做呢?或者我必须自己写(听起来很乏味,因为我必须处理单引号和双引号,所有的转义等等)?

谢谢

编辑:我不想要额外的依赖,所以我写了一个简单的方法,它没有涵盖所有的东西,但它做了我想要的

代码语言:javascript
复制
public String[] getCmdArray(String cmd) { // Parses a regular command line and returns it as a string array for use with Runtime.exec()
    ArrayList<String> cmdArray = new ArrayList<String>();
    StringBuffer argBuffer = new StringBuffer();
    char[] quotes = {'"', '\''};
    char currentChar = 0, protect = '\\', separate = ' ';
    int cursor = 0;
    cmd = cmd.trim();
    while(cursor < cmd.length()) {
        currentChar = cmd.charAt(cursor);

        // Handle protected characters
        if(currentChar == protect) {
            if(cursor + 1 < cmd.length()) {
                char protectedChar = cmd.charAt(cursor + 1);
                argBuffer.append(protectedChar);
                cursor += 2;
            }
            else
                return null; // Unprotected \ at end of cmd
        }

        // Handle quoted args
        else if(inArray(currentChar, quotes)) {
            int nextQuote = cmd.indexOf(currentChar, cursor + 1);
            if(nextQuote != -1) {
                cmdArray.add(cmd.substring(cursor + 1, nextQuote));
                cursor = nextQuote + 1;
            }
            else
                return null; // Unprotected, unclosed quote
        }

        // Handle separator
        else if(currentChar == separate) {
            if(argBuffer.length() != 0)
                cmdArray.add(argBuffer.toString());
            argBuffer.setLength(0);
            cursor++;
        }

        else {
            argBuffer.append(currentChar);
            cursor++;
        }
    }

    if(currentChar != 0) // Handle the last argument (doesn't have a space after it)
        cmdArray.add(argBuffer.toString());

    return cmdArray.toArray(new String[cmdArray.size()]);
}

public boolean inArray(char needle, char[] stack) {
    for(char c : stack)
        if(needle == c)
            return true;
    return false;
}
EN

回答 2

Stack Overflow用户

发布于 2013-08-23 21:51:08

使用Apache Common CLI库。它可以很好地解析选项和参数。http://commons.apache.org/proper/commons-cli/

票数 0
EN

Stack Overflow用户

发布于 2013-08-23 21:53:56

有许多Java库可以帮助您进行命令行解析;有关示例,请参阅How to parse command line arguments in Java?

但是,“智能地”解析命令参数取决于您来自何处:

  • 如果您想要一个能够根据一致的语法或元语法来解析命令参数的东西,那么这些示例中的一些肯定能做到这一点。
  • 如果您想要的东西能够神奇地理解用户的真正意思,那么您就是在梦想
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18404128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档