java自定义定义脚本规则,解析简单的脚本实现打印图形布局定制
2023-03-10 本文已影响0人
吉凶以情迁
用java 构建一个 自定义的脚本解析字符串, 如下 label(1,1,fa,true) 就动态变成new Label对象 并传递参数1,1,"fa",true进去, 同时还支持整数变量的运算
以下是一个简单的Java代码示例,用于解析类似于 "label(1,1,fa,true)" 的字符串,并将其转换为对应的Label对象。
java
Copy code
import java.util.*;
import java.util.regex.*;
public class ScriptParser {
private Map<String, Integer> variables = new HashMap<>();
public Object evaluate(String script) {
// 解析整数变量
Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
Matcher varMatcher = varPattern.matcher(script);
while (varMatcher.find()) {
String varName = varMatcher.group(1);
int varValue = Integer.parseInt(varMatcher.group(2));
variables.put(varName, varValue);
}
// 解析函数调用
Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
Matcher funcMatcher = funcPattern.matcher(script);
if (funcMatcher.matches()) {
String funcName = funcMatcher.group(1);
String[] args = funcMatcher.group(2).split(",");
if (funcName.equals("label")) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String text = evaluateString(args[2].trim());
boolean visible = evaluateBoolean(args[3].trim());
return new Label(x, y, text, visible);
}
}
return null;
}
private int evaluateInt(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression);
}
// 如果是数字,直接转换为整数
try {
return Integer.parseInt(expression);
} catch (NumberFormatException e) {
// 如果不是数字,尝试解析表达式
Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
Matcher exprMatcher = exprPattern.matcher(expression);
if (exprMatcher.matches()) {
int left = evaluateInt(exprMatcher.group(1).trim());
int right = evaluateInt(exprMatcher.group(3).trim());
switch (exprMatcher.group(2).trim()) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return left / right;
}
}
}
return 0;
}
private String evaluateString(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return String.valueOf(variables.get(expression));
}
// 如果是字符串,去掉引号
if (expression.startsWith("\"") && expression.endsWith("\"")) {
return expression.substring(1, expression.length() - 1);
}
return "";
}
private boolean evaluateBoolean(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression) != 0;
}
// 如果是布尔值,直接转换为布尔型
if (expression.equalsIgnoreCase("true")) {
return true;
} else if (expression.equalsIgnoreCase("false")) {
return false;
}
return false;
}
}
java
Copy code
String script = "label(1, 2, \"hello\", true)";
ScriptParser parser = new ScriptParser();
Label label = (Label)
调整后
public class ScriptEngine {
private Map<String, Integer> variables = new HashMap<>();
public PrintLabelModel.BasePrint evaluate(String script) {
// 解析整数变量
Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
Matcher varMatcher = varPattern.matcher(script);
while (varMatcher.find()) {
String varName = varMatcher.group(1);
int varValue = Integer.parseInt(varMatcher.group(2));
variables.put(varName, varValue);
}
// 解析函数调用
Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
Matcher funcMatcher = funcPattern.matcher(script);
if (funcMatcher.matches()) {
String funcName = funcMatcher.group(1);
String[] args = funcMatcher.group(2).split(",");
if (funcName.equals("label") && args.length > 3) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String label = evaluateString(args[2].trim());
String text = evaluateString(args[3].trim());
PrintLabelModel.TextLeftRight printLabelModel = new PrintLabelModel.TextLeftRight(x, y, label, text);
int fontSize = args.length > 4 ? evaluateInt(args[4].trim()) : printLabelModel.fontSize;
int limitRight = args.length > 5 ? evaluateInt(args[5].trim()) : 0;
printLabelModel.fontSize = fontSize;
printLabelModel.limitRight = limitRight;
return printLabelModel;
} else if (funcName.equals("text") && args.length > 2) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String text = evaluateString(args[2].trim());
PrintLabelModel.Text printLabelModel = new PrintLabelModel.Text(x, y, text);
int fontSize = args.length > 3 ? evaluateInt(args[3].trim()) : printLabelModel.fontsize;
int limitRight = args.length > 4 ? evaluateInt(args[4].trim()) : 0;
printLabelModel.fontsize = fontSize;
printLabelModel.limitRight = limitRight;
return printLabelModel;
} else if (funcName.equals("qrcode") && args.length > 3) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
int size = evaluateInt(args[2].trim());
String text = evaluateString(args[3].trim());
boolean showText = args.length > 4 ? evaluateBoolean(args[4].trim()) : false;
PrintLabelModel.QRCode printLabelModel = new PrintLabelModel.QRCode(x, y, size, text, showText);
return printLabelModel;
} else if (funcName.equals("barcode") && args.length > 4) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
int width = evaluateInt(args[2].trim());
int height = evaluateInt(args[3].trim());
String text = evaluateString(args[4].trim());
boolean showText = args.length > 5 ? evaluateBoolean(args[5].trim()) : false;
PrintLabelModel.BarCode printLabelModel = new PrintLabelModel.BarCode(x, y, width, height, text, showText);
int fontSize = args.length > 6 ?evaluateInt(args[6].trim()):printLabelModel.fontsize;
printLabelModel.fontsize=fontSize;
return printLabelModel;
}
}
return null;
}
private int evaluateInt(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression);
}
// 如果是数字,直接转换为整数
try {
return Integer.parseInt(expression);
} catch (NumberFormatException e) {
// 如果不是数字,尝试解析表达式
Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
Matcher exprMatcher = exprPattern.matcher(expression);
if (exprMatcher.matches()) {
int left = evaluateInt(exprMatcher.group(1).trim());
int right = evaluateInt(exprMatcher.group(3).trim());
switch (exprMatcher.group(2).trim()) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return left / right;
}
}
}
return 0;
}
private String evaluateString(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return String.valueOf(variables.get(expression));
}
// 如果是字符串,去掉引号
if (expression.startsWith("\"") && expression.endsWith("\"")) {
return expression.substring(1, expression.length() - 1);
}
return "";
}
private boolean evaluateBoolean(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression) != 0;
}
// 如果是布尔值,直接转换为布尔型
if (expression.equalsIgnoreCase("true")) {
return true;
} else if (expression.equalsIgnoreCase("false")) {
return false;
}
return false;
}
经过调整发现他写的不支持多行调整后
public class ScriptEngine {
private Map<String, Integer> variables = new HashMap<>();
public PrintLabelModel evaluate(String script) {
PrintLabelModel model=new PrintLabelModel();
String[] split = script.split("\n");
for (String currentLine : split) {
if(currentLine==null||currentLine.trim().length()==0||currentLine.startsWith("#") ||currentLine.startsWith("//")||currentLine.startsWith("--")){
continue;
}
// 解析整数变量
Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
Matcher varMatcher = varPattern.matcher(script);
while (varMatcher.find()) {
String varName = varMatcher.group(1);
int varValue = Integer.parseInt(varMatcher.group(2));
variables.put(varName, varValue);
}
// 解析函数调用
Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
Matcher funcMatcher = funcPattern.matcher(currentLine);
if (funcMatcher.matches()) {
String funcName = funcMatcher.group(1);
String[] args = funcMatcher.group(2).split(",");
if (funcName.equals("label") && args.length > 3) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String label = evaluateString(args[2].trim());
String text = evaluateString(args[3].trim());
PrintLabelModel.TextLeftRight printLabelModel = new PrintLabelModel.TextLeftRight(x, y, label, text);
int fontSize = args.length > 4 ? evaluateInt(args[4].trim()) : printLabelModel.fontSize;
int limitRight = args.length > 5 ? evaluateInt(args[5].trim()) : 0;
printLabelModel.fontSize = fontSize;
printLabelModel.limitRight = limitRight;
model.infos.add(printLabelModel);
} else if (funcName.equals("text") && args.length > 2) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String text = evaluateString(args[2].trim());
PrintLabelModel.Text printLabelModel = new PrintLabelModel.Text(x, y, text);
int fontSize = args.length > 3 ? evaluateInt(args[3].trim()) : printLabelModel.fontsize;
int limitRight = args.length > 4 ? evaluateInt(args[4].trim()) : 0;
printLabelModel.fontsize = fontSize;
printLabelModel.limitRight = limitRight;
model.infos.add(printLabelModel);
} else if (funcName.equals("qrcode") && args.length > 3) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
int size = evaluateInt(args[2].trim());
String text = evaluateString(args[3].trim());
boolean showText = args.length > 4 ? evaluateBoolean(args[4].trim()) : false;
PrintLabelModel.QRCode printLabelModel = new PrintLabelModel.QRCode(x, y, size, text, showText);
model.infos.add(printLabelModel);
} else if (funcName.equals("barcode") && args.length > 4) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
int width = evaluateInt(args[2].trim());
int height = evaluateInt(args[3].trim());
String text = evaluateString(args[4].trim());
boolean showText = args.length > 5 ? evaluateBoolean(args[5].trim()) : false;
PrintLabelModel.BarCode printLabelModel = new PrintLabelModel.BarCode(x, y, width, height, text, showText);
int fontSize = args.length > 6 ?evaluateInt(args[6].trim()):printLabelModel.fontsize;
printLabelModel.fontsize=fontSize;
model.infos.add(printLabelModel);
}
}
}
return model;
}
private int evaluateInt(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression);
}
// 如果是数字,直接转换为整数
try {
return Integer.parseInt(expression);
} catch (NumberFormatException e) {
// 如果不是数字,尝试解析表达式
Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
Matcher exprMatcher = exprPattern.matcher(expression);
if (exprMatcher.matches()) {
int left = evaluateInt(exprMatcher.group(1).trim());
int right = evaluateInt(exprMatcher.group(3).trim());
switch (exprMatcher.group(2).trim()) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return left / right;
}
}
}
return 0;
}
private String evaluateString(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return String.valueOf(variables.get(expression));
}
// 如果是字符串,去掉引号
if (expression.startsWith("\"") && expression.endsWith("\"")) {
return expression.substring(1, expression.length() - 1);
}
return "";
}
private boolean evaluateBoolean(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression) != 0;
}
// 如果是布尔值,直接转换为布尔型
if (expression.equalsIgnoreCase("true")) {
return true;
} else if (expression.equalsIgnoreCase("false")) {
return false;
}
return false;
}
public static PrintLabelModel script2printLabelModel(String content) {
String[] split = content.split("\n");
LinkedHashMap<String, String> vars = new LinkedHashMap<>();
for (String s : split) {
}
return null;
}
}
上面还有一些问题 比如不支持一行多个变量定义 ,不支持 一行多个
也不支持a=b+1的识别
修正a=b+1识别
// Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
Pattern varPattern = Pattern.compile("^([a-z]+)\\s*=\\s*([a-z0-9+*-\\/()]+)$");
最后的代码如下
public class ScriptEngine {
private Map<String, Integer> variables = new HashMap<>();
public PrintLabelModel evaluate(String script) {
PrintLabelModel model = new PrintLabelModel();
String[] split = script.split("\n");
for (String currentLine : split) {
if (currentLine == null || currentLine.trim().length() == 0 || currentLine.startsWith("#") || currentLine.startsWith("//") || currentLine.startsWith("--")) {
continue;
}
for (String block : currentLine.split(";")) {
// 解析整数变量
// Pattern varPattern = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)");
Pattern varPattern = Pattern.compile("^([a-z]+)\\s*=\\s*([a-z0-9+*-\\/()]+)$");
Matcher varMatcher = varPattern.matcher(block);
while (varMatcher.find()) {
String varName = varMatcher.group(1);
int varValue = evaluateInt(varMatcher.group(2));//Integer.parseInt(varMatcher.group(2));
variables.put(varName, varValue);
}
// 解析函数调用
Pattern funcPattern = Pattern.compile("(\\w+)\\((.*)\\)");
Matcher funcMatcher = funcPattern.matcher(block);
if (funcMatcher.matches()) {
String funcName = funcMatcher.group(1);
String[] args = funcMatcher.group(2).split(",");
if (funcName.equals("label") && args.length > 3) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String label = evaluateString(args[2].trim());
String text = evaluateString(args[3].trim());
PrintLabelModel.TextLeftRight printLabelModel = new PrintLabelModel.TextLeftRight(x, y, label, text);
int fontSize = args.length > 4 ? evaluateInt(args[4].trim()) : printLabelModel.fontSize;
int limitRight = args.length > 5 ? evaluateInt(args[5].trim()) : 0;
printLabelModel.fontSize = fontSize;
printLabelModel.limitRight = limitRight;
model.infos.add(printLabelModel);
} else if (funcName.equals("print")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < args.length; i++) {
sb.append(evaluateString(args[i]));
if (i != args.length - 1) {
sb.append(" ");
}
}
System.out.print(sb);
} else if (funcName.equals("text") && args.length > 2) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
String text = evaluateString(args[2].trim());
PrintLabelModel.Text printLabelModel = new PrintLabelModel.Text(x, y, text);
int fontSize = args.length > 3 ? evaluateInt(args[3].trim()) : printLabelModel.fontsize;
int limitRight = args.length > 4 ? evaluateInt(args[4].trim()) : 0;
printLabelModel.fontsize = fontSize;
printLabelModel.limitRight = limitRight;
model.infos.add(printLabelModel);
} else if (funcName.equals("qrcode") && args.length > 3) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
int size = evaluateInt(args[2].trim());
String text = evaluateString(args[3].trim());
boolean showText = args.length > 4 ? evaluateBoolean(args[4].trim()) : false;
PrintLabelModel.QRCode printLabelModel = new PrintLabelModel.QRCode(x, y, size, text, showText);
model.infos.add(printLabelModel);
} else if (funcName.equals("barcode") && args.length > 4) {
int x = evaluateInt(args[0].trim());
int y = evaluateInt(args[1].trim());
int width = evaluateInt(args[2].trim());
int height = evaluateInt(args[3].trim());
String text = evaluateString(args[4].trim());
boolean showText = args.length > 5 ? evaluateBoolean(args[5].trim()) : false;
PrintLabelModel.BarCode printLabelModel = new PrintLabelModel.BarCode(x, y, width, height, text, showText);
int fontSize = args.length > 6 ? evaluateInt(args[6].trim()) : printLabelModel.fontsize;
printLabelModel.fontsize = fontSize;
model.infos.add(printLabelModel);
}
}
}
}
return model;
}
private int evaluateInt(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression);
}
// 如果是数字,直接转换为整数
try {
return Integer.parseInt(expression);
} catch (NumberFormatException e) {
// 如果不是数字,尝试解析表达式
Pattern exprPattern = Pattern.compile("(\\w+)\\s*([\\+\\-\\*\\/])\\s*(\\w+)");
Matcher exprMatcher = exprPattern.matcher(expression);
if (exprMatcher.matches()) {
int left = evaluateInt(exprMatcher.group(1).trim());
int right = evaluateInt(exprMatcher.group(3).trim());
switch (exprMatcher.group(2).trim()) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return left / right;
}
}
}
return 0;
}
private String evaluateString(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return String.valueOf(variables.get(expression));
}
// 如果是字符串,去掉引号
if (expression.startsWith("\"") && expression.endsWith("\"")) {
return expression.substring(1, expression.length() - 1);
}
return expression;
}
private boolean evaluateBoolean(String expression) {
// 如果是变量,替换为变量的值
if (variables.containsKey(expression)) {
return variables.get(expression) != 0;
}
// 如果是布尔值,直接转换为布尔型
if (expression.equalsIgnoreCase("true")) {
return true;
} else if (expression.equalsIgnoreCase("false")) {
return false;
}
return false;
}
public static PrintLabelModel script2printLabelModel(String content) {
String[] split = content.split("\n");
LinkedHashMap<String, String> vars = new LinkedHashMap<>();
for (String s : split) {
}
return null;
}
}
执行测试
@Test
public void test(){
ScriptEngine scriptEngine=new ScriptEngine();
PrintLabelModel evaluate = scriptEngine.evaluate("x=3\ny=5\nc=x+3;\nprint(x,y,c);vara=1\nb=3\nlabel(vara,3,3,3,3,3,3)\ntext(x,y,nihao)\ntext(x,c,c)");
String s = JSON.toJSONString(evaluate);
System.out.print(s);
}
输出结果
3 5 6{"height":400,"infos":[{"content":"3","fontSize":3,"label":"3","limitRight":3,"newLineGap":3.0,"type":"textl","x":1,"y":3},{"content":"nihao","fontsize":15,"limitRight":0,"newLineGap":3,"type":"text","x":3,"y":5},{"content":"6","fontsize":15,"limitRight":0,"newLineGap":3,"type":"text","x":3,"y":6}],"width":600}