From 4bf60c037010cd5f6a902f53e7592f7e90c244a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 31 Oct 2023 09:41:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E5=BC=8F=E8=B4=9F=E6=95=B0=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E7=89=B9=E6=AE=8A=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../formlua/util/ExpressRegularUtil.java | 389 +++++++++--------- 1 file changed, 198 insertions(+), 191 deletions(-) diff --git a/src/com/engine/salary/formlua/util/ExpressRegularUtil.java b/src/com/engine/salary/formlua/util/ExpressRegularUtil.java index a953ef1ec..7a31f2fe1 100644 --- a/src/com/engine/salary/formlua/util/ExpressRegularUtil.java +++ b/src/com/engine/salary/formlua/util/ExpressRegularUtil.java @@ -2,6 +2,7 @@ package com.engine.salary.formlua.util; import com.alibaba.fastjson.JSONObject; import com.engine.salary.formlua.entity.parameter.FormulaContext; +import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Map; @@ -11,217 +12,223 @@ import java.util.regex.PatternSyntaxException; public class ExpressRegularUtil { - private static final String[] checkRegularNullParameter=new String[]{"TRUE","FALSE","NOW","TODAY"}; - private static final String[] operSymbs=new String[]{">",">=","=","<","<=","\\+","-","\\*","\\/","!="}; - private static final String checkRegularParameter="AND|OR|IF|NOT|LIKE|DATEDIFF|DATEADD|WEEKNUM|WEEKDAY|DATEFORMAT|Y|M|D|H|I|S|COUNT|SUM|MAX|MIN|CONCAT|SEARCH|TEXT|PAD|REPLACE|VALUE|LEN|LEFT|RIGHT|MID"; - private final static String leftCircleBracket="Unmatched closing '('"; - private final static String rightCircleBracket="Unmatched closing ')'"; - private final static String leftSquareBracket="Unmatched closing '['"; - private final static String rightSquareeBracket="Unmatched closing ']'"; - private final static String leftBigBracket="Unmatched closing '{'"; - private final static String rightBigBracket="Unmatched closing '}'"; - public static boolean checkFuncExpress(String str){ - filter(str); - return true; - } + private static final String[] checkRegularNullParameter = new String[]{"TRUE", "FALSE", "NOW", "TODAY"}; + private static final String[] operSymbs = new String[]{">", ">=", "=", "<", "<=", "\\+", "-", "\\*", "\\/", "!="}; + private static final String checkRegularParameter = "AND|OR|IF|NOT|LIKE|DATEDIFF|DATEADD|WEEKNUM|WEEKDAY|DATEFORMAT|Y|M|D|H|I|S|COUNT|SUM|MAX|MIN|CONCAT|SEARCH|TEXT|PAD|REPLACE|VALUE|LEN|LEFT|RIGHT|MID"; + private final static String leftCircleBracket = "Unmatched closing '('"; + private final static String rightCircleBracket = "Unmatched closing ')'"; + private final static String leftSquareBracket = "Unmatched closing '['"; + private final static String rightSquareeBracket = "Unmatched closing ']'"; + private final static String leftBigBracket = "Unmatched closing '{'"; + private final static String rightBigBracket = "Unmatched closing '}'"; - public static boolean isContainChinese(String str) { - Pattern p = Pattern.compile("[\u4E00-\u9FA5|\\!|\\,|\\。|\\(|\\)|\\《|\\》|\\“|\\”|\\?|\\:|\\;|\\【|\\】]"); - Matcher m = p.matcher(str); - if (m.find()) { - return true; - } - return false; - } + public static boolean checkFuncExpress(String str) { + filter(str); + return true; + } - private static void filter(String formula){ - try { - testSymbol(formula); - checkNullRegular(formula); - checkOperatorNullParam(formula); - formula=formula.replaceAll("","#"); - String leftReplace=""; - String rightReplace=""; - leftReplace=formula.replaceAll("\\(",""); - rightReplace=formula.replaceAll("\\)",""); - if(leftReplace.length()>rightReplace.length()){ - PatternSyntaxException patternSyntaxException=new PatternSyntaxException(leftCircleBracket,formula,formula.lastIndexOf(")")); - throw patternSyntaxException; - } - if(leftReplace.length()rightReplace.length()){ - PatternSyntaxException patternSyntaxException=new PatternSyntaxException(leftBigBracket,formula,formula.lastIndexOf("}")); - throw patternSyntaxException; - } - if(leftReplace.length() rightReplace.length()) { + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(leftCircleBracket, formula, formula.lastIndexOf(")")); + throw patternSyntaxException; + } + if (leftReplace.length() < rightReplace.length()) { + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(rightCircleBracket, formula, formula.indexOf("(")); + throw patternSyntaxException; + } - leftReplace=formula.replaceAll("\\[",""); - rightReplace=formula.replaceAll("]",""); - if(leftReplace.length()>rightReplace.length()){ - PatternSyntaxException patternSyntaxException=new PatternSyntaxException(leftSquareBracket,formula,formula.lastIndexOf("]")); - throw patternSyntaxException; - } - if(leftReplace.length() rightReplace.length()) { + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(leftBigBracket, formula, formula.lastIndexOf("}")); + throw patternSyntaxException; + } + if (leftReplace.length() < rightReplace.length()) { + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(rightBigBracket, formula, formula.indexOf("{")); + throw patternSyntaxException; + } - } catch (PatternSyntaxException e) { - String error=e.getDescription().trim(); - int errorIdx=e.getIndex(); - int errorEndIdx=-1; - switch (error){ - case leftCircleBracket: - error="'('括号没有找到"; - errorEndIdx=-1; - break; - case rightCircleBracket: - error="'('括号没有闭合"; - errorEndIdx=-1; - break; - case leftSquareBracket: - error="'['括号没有找到"; - errorEndIdx=-1; - break; - case rightSquareeBracket: - error="'['括号没有闭合"; - errorEndIdx=-1; - break; - case leftBigBracket: - error="'{'括号没有找到"; - errorEndIdx=-1; - break; - case rightBigBracket: - error="'{'括号没有闭合"; - errorEndIdx=-1; - break; - case "TRUE函数不能有参数": - errorEndIdx=errorIdx+4; - break; - case "FALSE函数不能有参数": - errorEndIdx=errorIdx+5; - break; - case "NOW函数不能有参数": - errorEndIdx=errorIdx+3; - break; - case "TODAY函数不能有参数": - errorEndIdx=errorIdx+5; - break; + leftReplace = formula.replaceAll("\\[", ""); + rightReplace = formula.replaceAll("]", ""); + if (leftReplace.length() > rightReplace.length()) { + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(leftSquareBracket, formula, formula.lastIndexOf("]")); + throw patternSyntaxException; + } + if (leftReplace.length() < rightReplace.length()) { + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(rightSquareeBracket, formula, formula.indexOf("[")); + throw patternSyntaxException; + } - } - JSONObject catchJson=null; - if(errorEndIdx<0){ - catchJson= ErrorUtil.buildError(formula,errorIdx+1,null,error); - }else { - catchJson= ErrorUtil.buildError(formula,errorIdx+1,errorEndIdx,null,error); - } + } catch (PatternSyntaxException e) { + String error = e.getDescription().trim(); + int errorIdx = e.getIndex(); + int errorEndIdx = -1; + switch (error) { + case leftCircleBracket: + error = "'('括号没有找到"; + errorEndIdx = -1; + break; + case rightCircleBracket: + error = "'('括号没有闭合"; + errorEndIdx = -1; + break; + case leftSquareBracket: + error = "'['括号没有找到"; + errorEndIdx = -1; + break; + case rightSquareeBracket: + error = "'['括号没有闭合"; + errorEndIdx = -1; + break; + case leftBigBracket: + error = "'{'括号没有找到"; + errorEndIdx = -1; + break; + case rightBigBracket: + error = "'{'括号没有闭合"; + errorEndIdx = -1; + break; + case "TRUE函数不能有参数": + errorEndIdx = errorIdx + 4; + break; + case "FALSE函数不能有参数": + errorEndIdx = errorIdx + 5; + break; + case "NOW函数不能有参数": + errorEndIdx = errorIdx + 3; + break; + case "TODAY函数不能有参数": + errorEndIdx = errorIdx + 5; + break; - catchJson.put("formula",formula); - throw new PatternSyntaxException(catchJson.toJSONString(),null,errorIdx+1); - } - } + } + JSONObject catchJson = null; + if (errorEndIdx < 0) { + catchJson = ErrorUtil.buildError(formula, errorIdx + 1, null, error); + } else { + catchJson = ErrorUtil.buildError(formula, errorIdx + 1, errorEndIdx, null, error); + } - private static void checkNullRegular(String formula){ - String filterPattern=null; - for(int i=0;i=0){ - if(FormulaContext.get().getValue(checkRegularNullParameter[i])!=null){ - Integer paramCount=FormulaContext.get().getValue(checkRegularNullParameter[i]); - paramCount++; - FormulaContext.get().setValue(checkRegularNullParameter[i]); - }else { - FormulaContext.get().setValue(checkRegularNullParameter[i]); - } - filterPattern=checkRegularNullParameter[i]+"{1}\\({1}\\){1}"; - Pattern pattern= Pattern.compile(filterPattern); - Matcher matcher=pattern.matcher(formula); - boolean excuteBool=matcher.find(); - if(!excuteBool){ - eidx=0; - Integer errorCount=FormulaContext.get().getFormulaJson().getInteger(checkRegularNullParameter[i]); - String [] errorCutArray=formula.split(checkRegularNullParameter[i]); - for (int fi=0;fi1&&fi>0){ - eidx+=checkRegularNullParameter[i].length(); - } - } - PatternSyntaxException patternSyntaxException=new PatternSyntaxException(checkRegularNullParameter[i]+"函数不能有参数",formula,eidx); - throw patternSyntaxException; - } - }else { + catchJson.put("formula", formula); + throw new PatternSyntaxException(catchJson.toJSONString(), null, errorIdx + 1); + } + } - } - } - } + private static void checkNullRegular(String formula) { + String filterPattern = null; + for (int i = 0; i < checkRegularNullParameter.length; i++) { + int eidx = formula.indexOf(checkRegularNullParameter[i]); + if (eidx >= 0) { + if (FormulaContext.get().getValue(checkRegularNullParameter[i]) != null) { + Integer paramCount = FormulaContext.get().getValue(checkRegularNullParameter[i]); + paramCount++; + FormulaContext.get().setValue(checkRegularNullParameter[i]); + } else { + FormulaContext.get().setValue(checkRegularNullParameter[i]); + } + filterPattern = checkRegularNullParameter[i] + "{1}\\({1}\\){1}"; + Pattern pattern = Pattern.compile(filterPattern); + Matcher matcher = pattern.matcher(formula); + boolean excuteBool = matcher.find(); + if (!excuteBool) { + eidx = 0; + Integer errorCount = FormulaContext.get().getFormulaJson().getInteger(checkRegularNullParameter[i]); + String[] errorCutArray = formula.split(checkRegularNullParameter[i]); + for (int fi = 0; fi < errorCount; fi++) { + eidx += errorCutArray[fi].length(); + if (errorCutArray.length > 1 && fi > 0) { + eidx += checkRegularNullParameter[i].length(); + } + } + PatternSyntaxException patternSyntaxException = new PatternSyntaxException(checkRegularNullParameter[i] + "函数不能有参数", formula, eidx); + throw patternSyntaxException; + } + } else { - private static void checkOperatorNullParam(String formula){ - formula=formula.trim(); - JSONObject errorJson=new JSONObject(); - Map operMap=new HashMap<>(); + } + } + } - for (int i=0;i operMap = new HashMap<>(); - Matcher m=wrongPone.matcher(formula); + for (int i = 0; i < operSymbs.length; i++) { + String operSymb = operSymbs[i]; + if (formula.indexOf(operSymb) < 0) { + continue; + } + if (operMap.get(operSymb) == null) { + operMap.put(operSymb, 1); + } else { + operMap.put(operSymb, operMap.get(operSymb) + 1); + } + String commonP = "(" + operSymb + ")"; + Pattern wrongPone = Pattern.compile("^.+" + commonP + "+?$"); + Pattern wrongPtwo = Pattern.compile("^" + commonP + "+?.+$"); + Pattern wrongPthree = Pattern.compile("^" + commonP + "+?$"); - if(m.find()){ - errorJson= ErrorUtil.buildError(operSymb,formula.length(),operMap.get(operSymb),"操作符两端的参数不能为空"); - throw new RuntimeException(errorJson.getString("msg")); - } + Matcher m = wrongPone.matcher(formula); - Matcher mtwo=wrongPtwo.matcher(formula); - if(mtwo.find()){ - errorJson= ErrorUtil.buildError(operSymb,1,operMap.get(operSymb),"操作符两端的参数不能为空"); - throw new RuntimeException(errorJson.getString("msg")); - } + if (m.find()) { + errorJson = ErrorUtil.buildError(operSymb, formula.length(), operMap.get(operSymb), "操作符两端的参数不能为空"); + throw new RuntimeException(errorJson.getString("msg")); + } - Matcher mthree=wrongPthree.matcher(formula); - if(mthree.find()){ - errorJson= ErrorUtil.buildError(operSymb,1,operMap.get(operSymb),"操作符两端的参数不能为空"); - throw new RuntimeException(errorJson.getString("msg")); - } + Matcher mtwo = wrongPtwo.matcher(formula); + if (mtwo.find()) { + //-,负数特殊处理 + if (StringUtils.equals(operSymb, "-")) { + return; + } + errorJson = ErrorUtil.buildError(operSymb, 1, operMap.get(operSymb), "操作符两端的参数不能为空"); + throw new RuntimeException(errorJson.getString("msg")); + } - } + Matcher mthree = wrongPthree.matcher(formula); + if (mthree.find()) { + errorJson = ErrorUtil.buildError(operSymb, 1, operMap.get(operSymb), "操作符两端的参数不能为空"); + throw new RuntimeException(errorJson.getString("msg")); + } + + } - } - public static void testSymbol(String formula){ - Pattern pattern=Pattern.compile(",+?\\s*\\)"); - Matcher m=pattern.matcher(formula); - if(m.find()){ - int idx=formula.indexOf(m.group()); - PatternSyntaxException patternSyntaxException=new PatternSyntaxException("参数格式错误",formula,idx); - throw patternSyntaxException; - } - } + } - public static void main(String args[]){ + public static void testSymbol(String formula) { + Pattern pattern = Pattern.compile(",+?\\s*\\)"); + Matcher m = pattern.matcher(formula); + if (m.find()) { + int idx = formula.indexOf(m.group()); + PatternSyntaxException patternSyntaxException = new PatternSyntaxException("参数格式错误", formula, idx); + throw patternSyntaxException; + } + } - checkOperatorNullParam(" abc>="); - } + public static void main(String args[]) { + + checkOperatorNullParam(" abc>="); + } }