Skip to content

超简单的行命令解析器,自定义语义解析和语义执行器

License

Notifications You must be signed in to change notification settings

Verlif/cmdline-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CmdlineParser

行命令解析器
超简单的行命令解析器,用于解析与执行行命令,例如:

--username Verlif --commit "hello world!" --allowed

解析出来就是这样的数据表:

指令key 指令值
username Verlif
commit hello world
allowed null

并且可以自定义每个指令key执行的操作。

使用

public class Main {

   public static void main(String[] args) {
      String line = "-abc --username Verlif --commit \"hello world!\" --allowed";
      CmdlineParser parser = new CmdlineParser();
      // 忽略未知命令,否则会抛出UnknownCmdKeyException异常
      parser.ignoreUnknownKey();
      // 忽略关键词大小写,可以让"--KEy"也能匹配到"key"
      parser.ignoreCase();
      // 添加指令执行器
      parser.setArgParser(new PrefixWithConfigArgParser("--"));
      parser.addHandler("username", param -> {
         System.out.println("解析到username - "  + param);
      });
      parser.addHandler("allowed", param -> {
         System.out.println("解析到allowed - "  + param);
      });
      parser.addHandler("a", param -> {
         System.out.println("解析到a - " + param);
      });
      parser.addHandler("b", param -> {
         System.out.println("解析到 - " + param);
      });
      parser.addHandler("c", param -> {
         System.out.println("解析到 - " + param);
      });
      // 执行指令
      parser.exec(line);
      // 上方指令结果与下方相同
      ArgValues argValues = new ArgValues();
      argValues.add("a", null);
      argValues.add("b", null);
      argValues.add("c", null);
      argValues.add("username", "Verlif");
      argValues.add("commit", "hello world!");
      argValues.add("allowed", null);
      parser.exec(argValues);
      // 甚至相当于这样
      HtmlUrlArgParser htmlUrlArgParser = new HtmlUrlArgParser();
      parser.setArgParser(htmlUrlArgParser);
      parser.exec("127.0.0.1:81/queue/queue?a&b&c&username=Verlif&commit=hello world&allowed");
   }

}

执行结果如下:

以下内容输出3次

解析到a - null
解析到 - null
解析到 - null
解析到username - Verlif
解析到allowed - null

自定义

参数解析器

用于解析指令key与对应参数值的类,与需要处理的指令格式有关。例如将--username Verlif --commit "hello world!" --allowed解析成以下内容:

指令key 指令值
username Verlif
commit hello world
allowed null

开发者可以通过自定义参数解析器来解析不同指令格式的字符串,例如解析HTMLUrl的参数,例如解析127.0.0.1:81/queue/queue?a&b&c&username=Verlif&commit=hello world&allowed

示例:

/**
 * 简单的HTMLUrl参数解析器
 *
 * @author Verlif
 */
public class HtmlUrlArgParser implements ArgParser {

    @Override
    public ArgValues parseLine(String line) {
        String[] ss = line.split("\\?", 2);
        if (ss.length == 1) {
            return new ArgValues();
        }
        return toArgValues(ss[1]);
    }

    private ArgValues toArgValues(String paramStr) {
        ArgValues argValues = new ArgValues();
        String[] params = paramStr.split("&");
        for (String param : params) {
            int i = param.indexOf('=');
            if (i == -1) {
                argValues.add(param, null);
            } else {
                argValues.add(param.substring(0, i), param.substring(i + 1));
            }
        }
        return argValues;
    }
}

指令执行器

执行对应指令的方法类,类似Runnale,只有一个handle(String param)方法。

public interface CmdHandler {

    /**
     * 执行器执行核心
     *
     * @param param 参数;可能为null
     */
    void handle(String param);
}

注意

指令调用的顺序与关键词的传入顺序有关。

例如--a 123 --b 321 --a 789就会调用以下流程:

a执行器 -> b执行器 -> a执行器

添加依赖

  1. 添加Jitpack仓库源

    lastVersion:

    maven

    <repositories>
           <repository>
               <id>jitpack.io</id>
               <url>https://jitpack.io</url>
           </repository>
    </repositories>

    Gradle

    allprojects {
      repositories {
          maven { url 'https://jitpack.io' }
      }
    }
    
  2. 加依赖

    maven

      <dependencies>
              <dependency>
                  <groupId>com.github.Verlif</groupId>
                  <artifactId>cmdline-parser</artifactId>
                  <version>lastVersion</version>
              </dependency>
          </dependencies>

    Gradle

    dependencies {
      implementation 'com.github.Verlif:cmdline-parser:lastVersion'
    }
    

About

超简单的行命令解析器,自定义语义解析和语义执行器

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages