【问题标题】:RegEx to split command line arguments正则表达式拆分命令行参数
【发布时间】:2012-03-03 19:53:57
【问题描述】:

我有一个简单的 Java 应用程序,它是命令行应用程序的 GUI,并且我有一个字段,用户可以在其中添加其他命令行参数。问题是,我想将所有参数传递给 CLI 应用程序使用的“选项文件”,但为此我需要相应地拆分每个参数。

一个例子:

--edit info --set title=My Title 1 --edit track:v1 --set flag-default=0 --set flag-forced=0

必须成为

--edit
info
--set
title=My Title 1
--edit
track:v1
--set
flag-default=1
--set
flag-forced=0

我基本上需要一个匹配这个的正则表达式: --set[MATCH]title=我的标题1[MATCH]--edit[MATCH]track:v1

我不知道这是否简单,我尝试了几个 RegEx 参数,但都超出了我的想象。

顺便说一句,CLI 应用程序是 mkvpropedit。

【问题讨论】:

  • --set title=test 1 --edit track:v1: 标题怎么定界?
  • 必须是正则表达式吗?我会尝试 Commons CI commons.apache.org/cli
  • @jpalecek:选项文件的标题不需要引号,它实际上会将引号视为文字引号。
  • JCommander 可以像上面一样优雅地进行命令行解析
  • 我会调查的。我还找到了一个可以实现的简单解决方案。 link

标签: java regex command-line-arguments


【解决方案1】:

我不明白为什么你需要一个正则表达式...

如果您不受某些我不理解的要求的限制,我真的认为要解析GNU style 命令行选项,您需要使用 GNU 实用程序getopt,尤其是它的Java version

如果您使用 Maven,请使用 boils down 将其添加到您的 pom:

<dependency>
    <groupId>gnu.getopt</groupId>
    <artifactId>java-getopt</artifactId>
    <version>1.0.13</version>
</dependency>

【讨论】:

    【解决方案2】:

    如果它不限于正则表达式,那么您可能会发现这个command line argument parsing 对实现您想要的很有用。它提供了比正则表达式更好的方法来做这些事情。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我不能真正将论点作为分隔符分开,因为那样我就不知道每个论点是什么。我最终这样做了:

      /**
       * This method takes the command line arguments and turns them back into a single string.
       * Then it looks for argument identifiers and values.  In my case the arguments were
       * like --action (or the synonym -a), --properties (or -p), etc.
       * 
       * I only needed the first letter of the argument for my purposes but you can adjust
       * the regex pattern to return more of group(1) if you need it.
       *
       * @param args
       */
      private HashMap<String,String> parseArguments(String[] args){
          HashMap<String,String> rawArguments = new HashMap<String,String>();
          String input = new String();
          for(int i=0;i<args.length;i++){
              input+=args[i]+" ";
          }
          Pattern pattern = Pattern.compile("-?-([A-z])[A-z]* (.*?)");
          Matcher matcher = pattern.matcher(input);
      
          String key=null;
          String val=null;
          int re=0;
          int st=0;
          while(matcher.find()){
              st=matcher.start();
              if(key!=null){
                  val=input.substring(re, st).trim();
                  rawArguments.put(key,val);
              }
      
              key=matcher.group(1);
              if(!matcher.hitEnd()){
                  re=matcher.end();
              }
          }
          val=input.substring(re).trim();
          rawArguments.put(key,val);
      
          return rawArguments;        
      }
      

      【讨论】:

        【解决方案4】:

        据我了解,您只需使用空格作为分隔符来拆分字符串。在这种情况下,请执行以下操作:str.split("\\s+")

        【讨论】:

        • 这行不通,因为有些参数可以有空格,比如“--set title=My Title 1”。
        猜你喜欢
        • 2021-08-04
        • 1970-01-01
        • 2016-07-14
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多