行命令解析器
超简单的行命令解析器,用于解析与执行行命令,例如:
--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
执行器
-
添加Jitpack仓库源
maven
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
Gradle
allprojects { repositories { maven { url 'https://jitpack.io' } } }
-
加依赖
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' }