【问题标题】:How to match java cmd arguments with regular expression?java - 如何将java cmd参数与正则表达式匹配?
【发布时间】:2012-07-30 09:58:39
【问题描述】:

我有这样的 cmd:

java Test -p 127.0.0.1:8080 -d D:\Desktop\temp.exe -o mingw -s 1024 -t 2000

我想用-p,-d-s(排除-p,-d,-s 本身)获取参数,并丢弃其他参数。

我尝试了几个小时但没有结果,有没有人可以帮助我?

我尝试了arg[i]和arg[i+1]的方式,但是如果args是这样的:-p -d xxx,用户不输入-p值,这个解决方案将不起作用并引起问题。

【问题讨论】:

  • 给出你试过的代码。为什么不给出一个起点?

标签: java regex arguments cmd expression


【解决方案1】:

如果您的所有选项都采用相同的形式-x value,那么您可以将您的 args 数组拆分为 -d 127.0.0.1:8080-d D:... 形式的组

for(int i=0; i < args.length; i+=2){
    //group args
}

for each group in groups:
    if group[0].equals("-d"){
          //do something
    }
}

或者,看看现有的 Java 中的 OptionParser 库。 How to parse command line arguments in Java?

【讨论】:

    【解决方案2】:

    使用这个正则表达式-(\w) ([\w!@#$%^&amp;*():\\/.]+) group[1] 包含标志,group[2] 包含参数

    【讨论】:

    • 你能解释一下这个正则表达式吗?我看不懂
    • - litteral symbol, (\w) any digit/letter/_, ([\w!@#$%^&amp;*():\\/.]) any symbol from [], + 1 and more previos symbols
    【解决方案3】:

    怎么样...

    for(int i = 0; i < args.length; i+=2) { 
     if(args[i].equals("-p") {
       //args[i+1] is the value
     } 
     ... 
    }
    

    它不使用正则表达式,耶 :)

    【讨论】:

    • 我更喜欢正则表达式,如果用户输入了错误的参数,比如 -p -d xxx,那么 arg[i+1] 会出错。
    【解决方案4】:

    此解决方案将您的 args 组装成地图:

    public static void main(String[] args) {
      final Map<Character, String> am = new HashMap<Character, String>();
      for (int i = 0; i+1 < args.length; i++)
        if (args[i].matches("-[pds]") && !args[i+1].startsWith("-"))
          am.put(args[i].charAt(1), args[++i]);
      System.out.println(am);
    }
    

    【讨论】:

    • 如果args输入错误,比如-p -d xxx,没有-p值,那就错了
    • ...而且很容易修复。固定。
    【解决方案5】:

    尽量不要创造一个大的表达,而是各种小的表达。例如,匹配 -p 部分的表达式是:-p ?(.*?)(未经测试)。

    【讨论】:

      【解决方案6】:

      你不需要正则表达式,因为参数来自一个数组,所以你只需循环它:

      public static void main(String[] args) {
        Map<String, String> argsMap = new HashMap<String, String>();
        int i = 0;
        while(i < args.length - 1 && args[i].startsWith("-")) {
          argsMap.put(args[i].substring(1), args[++i]);
        }
      
        System.out.println("-p arg was " + argsMap.get("p"));
        // etc.
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 2011-03-30
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多