博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 表达式解析(非原创)
阅读量:4677 次
发布时间:2019-06-09

本文共 29039 字,大约阅读时间需要 96 分钟。

因项目需要,在网上找来一套表达式解析方法,由于原来的方法太过于零散,不利于移植,现在整理在同一文件内;

文件中包含5个内部类,源码如下:

1 import java.util.ArrayList;   2 import java.util.Date;   3 import java.util.List;   4 import java.util.Stack;   5    6 /**   7  * @项目名称: sunson_pams   8  * @类名称: FormulaUtils   9  * @类描述: 非原创(慎用)  10  * @创建人: 唐泽齐  11  * @创建时间: 2017年12月15日 上午9:47:23  12  * @修改人: 唐泽齐  13  * @修改时间: 2017年12月15日 上午9:47:23  14  * @修改备注:  15  * @version: 1.0  16  */  17 public class FormulaUtils {  18   19     /**  20      * 表达式解析  21      */  22     public static ExpressionEvaluator ExpressionEvaluator;  23       24     public FormulaUtils() {  25         ExpressionEvaluator = new ExpressionEvaluator();  26     };  27       28     /**  29      * 表达式各个字符节点的类型枚举类  30      *   31      * @项目名称: sunson_pams  32      * @类名称: ExpressionNodeType  33      * @类描述:  34      * @创建人: 唐泽齐  35      * @创建时间: 2017年12月15日 上午9:49:48  36      * @修改人: 唐泽齐  37      * @修改时间: 2017年12月15日 上午9:49:48  38      * @修改备注:  39      * @version: 1.0  40      */  41     public enum ExpressionNodeType {  42   43         Unknown, Plus, // +  44         Subtract, /// -  45         MultiPly, // *  46         Divide, // /  47         LParentheses, // (  48         RParentheses, /// )  49         Mod, // % (求模,取余)  50         Power, // ^ (次幂)  51         BitwiseAnd, /// & (按位与)  52         BitwiseOr, /// | (按位或)  53         And, // && (逻辑与)  54         Or, /// || (逻辑或)  55         Not, /// ! (逻辑非)  56         Equal, /// == (相等)  57         Unequal, /// != 或 <> (不等于)  58         GT, /// > (大于)  59         LT, /// < (小于)  60         GTOrEqual, /// >= (大于等于)  61         LTOrEqual, /// <= (小于等于)  62         LShift, /// << (左移位)  63         RShift, /// >> (右移位)  64         Numeric, /// 数值,  65         String, Date, Like, // 包含  66         NotLike, // 不包含  67         StartWith, // 已什么开始  68         EndWith// 已什么结尾  69   70     }  71   72     /**  73      * 存储表达式运算符或操作数的各个节点的类  74      *   75      * @项目名称: sunson_pams  76      * @类名称: ExpressionNode  77      * @类描述:  78      * @创建人: 唐泽齐  79      * @创建时间: 2017年12月15日 上午9:50:50  80      * @修改人: 唐泽齐  81      * @修改时间: 2017年12月15日 上午9:50:50  82      * @修改备注:  83      * @version: 1.0  84      */  85     public static class ExpressionNode {  86   87         private String value;  88   89         private ExpressionNodeType type;  90   91         private int pri;  92   93         private ExpressionNode unitaryNode;  94   95         private Object numeric;  96   97         /**  98          *   99          * @param value 100          *            操作数或运算符 101          */ 102         public ExpressionNode(String value) { 103             this.value = value; 104             this.type = parseNodeType(value); 105             this.pri = getNodeTypePRI(this.type); 106             this.numeric = null; 107         } 108  109         public Object getNumeric() { 110             if (this.numeric == null) { 111  112                 if ((this.type == ExpressionNodeType.String) || (this.type == ExpressionNodeType.Date)) { 113                     return this.value; 114                 } 115  116                 if (this.type != ExpressionNodeType.Numeric) { 117                     return 0; 118                 } 119                 Double num = new Double(this.value); 120                 if (this.unitaryNode != null && this.unitaryNode.type == ExpressionNodeType.Subtract) { 121                     num = 0 - num; 122                 } 123                 this.numeric = num; 124             } 125             return numeric; 126         } 127  128         public void setNumeric(Object numeric) { 129             this.numeric = numeric; 130             this.value = this.numeric.toString(); 131         } 132  133         /** 134          * 设置或返回与当前节点相关联的一元操作符节点 135          *  136          * @param unitaryNode 137          */ 138         public void setUnitaryNode(ExpressionNode unitaryNode) { 139             this.unitaryNode = unitaryNode; 140         } 141  142         /** 143          * 解析节点类型 144          *  145          * @param value 146          * @return 147          */ 148         private ExpressionNodeType parseNodeType(String value) { 149             if (StringUtils.isEmpty(value)) { 150                 return ExpressionNodeType.Unknown; 151             } 152             switch (value) { 153             case "+": 154                 return ExpressionNodeType.Plus; 155             case "-": 156                 return ExpressionNodeType.Subtract; 157             case "*": 158                 return ExpressionNodeType.MultiPly; 159             case "/": 160                 return ExpressionNodeType.Divide; 161             case "%": 162                 return ExpressionNodeType.Mod; 163             case "^": 164                 return ExpressionNodeType.Power; 165             case "(": 166                 return ExpressionNodeType.LParentheses; 167             case ")": 168                 return ExpressionNodeType.RParentheses; 169             case "&": 170                 return ExpressionNodeType.BitwiseAnd; 171             case "|": 172                 return ExpressionNodeType.BitwiseOr; 173             case "&&": 174             case "
<并且>
": 175 case "并且": 176 return ExpressionNodeType.And; 177 case "||": 178 case "
<或者>
": 179 case "或者": 180 return ExpressionNodeType.Or; 181 case "!": 182 return ExpressionNodeType.Not; 183 case "==": 184 case "=": 185 return ExpressionNodeType.Equal; 186 case "!=": 187 case "<>": 188 case "≠": 189 return ExpressionNodeType.Unequal; 190 case ">": 191 return ExpressionNodeType.GT; 192 case "<": 193 return ExpressionNodeType.LT; 194 case ">=": 195 case "≥": 196 return ExpressionNodeType.GTOrEqual; 197 case "<=": 198 case "≤": 199 return ExpressionNodeType.LTOrEqual; 200 case "<<": 201 return ExpressionNodeType.LShift; 202 case ">>": 203 return ExpressionNodeType.RShift; 204 case "@": 205 case "
<包含>
": 206 case "包含": 207 return ExpressionNodeType.Like; 208 case "!@": 209 case "
<不包含>
": 210 case "不包含": 211 return ExpressionNodeType.NotLike; 212 case "!!$": 213 return ExpressionNodeType.StartWith; 214 case "!!@": 215 return ExpressionNodeType.EndWith; 216 217 } 218 if (isNumerics(value)) { 219 return ExpressionNodeType.Numeric; 220 } 221 if (isDatetime(value)) { 222 return ExpressionNodeType.Date; 223 } 224 if (value.contains("\"")) { 225 return ExpressionNodeType.String; 226 } 227 return ExpressionNodeType.Unknown; 228 } 229 230 /** 231 * 获取各节点类型的优先级 232 * 233 * @param nodeType 234 * @return 235 */ 236 private int getNodeTypePRI(ExpressionNodeType nodeType) { 237 switch (nodeType) { 238 case LParentheses: 239 case RParentheses: 240 return 9; 241 // 逻辑非是一元操作符,所以其优先级较高 242 case Not: 243 return 8; 244 case Mod: 245 return 7; 246 case MultiPly: 247 case Divide: 248 case Power: 249 return 6; 250 case Plus: 251 case Subtract: 252 return 5; 253 case LShift: 254 case RShift: 255 return 4; 256 case BitwiseAnd: 257 case BitwiseOr: 258 return 3; 259 case Equal: 260 case Unequal: 261 case GT: 262 case LT: 263 case GTOrEqual: 264 case LTOrEqual: 265 case Like: 266 case NotLike: 267 case StartWith: 268 case EndWith: 269 return 2; 270 case And: 271 case Or: 272 return 1; 273 default: 274 return 0; 275 } 276 277 } 278 279 /** 280 * 判断是否为数值 281 * 282 * @param op 283 * @return 284 */ 285 public boolean isNumerics(String op) { 286 return op.matches("^[\\+\\-]?(0|[1-9]\\d*|[1-9]\\d*\\.\\d+|0\\.\\d+)"); 287 } 288 289 /** 290 * 判断是否为日期 291 * 292 * @param op 293 * @return 294 */ 295 public static boolean isDatetime(String op) { 296 op = op.replace("\"", "").trim(); 297 return op.matches("\\d{4}\\-\\d{2}\\-\\d{2}(\\s\\d{2}\\:\\d{2}\\:\\d{2})?"); 298 } 299 300 /** 301 * 判断某个字符后是否需要更多的操作符 302 * 303 * @param c 304 * @return 305 */ 306 public boolean needMoreOperator(char c) { 307 switch (c) { 308 case '&': 309 case '|': 310 case '=': 311 case '!': 312 case '>': 313 case '<': 314 case '.': // 小数点 315 return true; 316 } 317 // //数字则需要更多 318 return Character.isDigit(c); 319 } 320 321 /** 322 * 判断两个字符是否是同一类 323 * 324 * @param c1 325 * @param c2 326 * @return 327 */ 328 public boolean IsCongener(char c1, char c2) { 329 if ((c1 == '(') || (c2 == '(')) { 330 return false; 331 } 332 if ((c1 == ')') || (c2 == ')')) { 333 return false; 334 } 335 if ((c1 == '"') || (c2 == '"')) { 336 return false; 337 } 338 if (Character.isDigit(c1) || (c1 == '.')) { 339 // c1为数字,则c2也为数字 340 return (Character.isDigit(c2) || (c2 == '.')); 341 } 342 return (!Character.isDigit(c2) && (c2 != '.')); 343 } 344 345 /** 346 * 判断某个字符是否是空白字符 347 * 348 * @param c 349 * @return 350 */ 351 public boolean IsWhileSpace(char c) { 352 return c == ' ' || c == '\t'; 353 } 354 355 /** 356 * 判断是否是一元操作符节点 357 * 358 * @param nodeType 359 * @return 360 */ 361 public static boolean IsUnitaryNode(ExpressionNodeType nodeType) { 362 return (nodeType == ExpressionNodeType.Plus || nodeType == ExpressionNodeType.Subtract); 363 } 364 365 public String getValue() { 366 return value; 367 } 368 369 public void setValue(String value) { 370 this.value = value; 371 } 372 373 public ExpressionNodeType getType() { 374 return type; 375 } 376 377 public void setType(ExpressionNodeType type) { 378 this.type = type; 379 } 380 381 public int getPri() { 382 return pri; 383 } 384 385 public void setPri(int pri) { 386 this.pri = pri; 387 } 388 389 public ExpressionNode getUnitaryNode() { 390 return unitaryNode; 391 } 392 } 393 394 /** 395 * 表达式异常类 396 * 397 * @项目名称: sunson_pams 398 * @类名称: ExpressionException 399 * @类描述: 400 * @创建人: 唐泽齐 401 * @创建时间: 2017年12月15日 上午9:52:13 402 * @修改人: 唐泽齐 403 * @修改时间: 2017年12月15日 上午9:52:13 404 * @修改备注: 405 * @version: 1.0 406 */ 407 public static class ExpressionException extends RuntimeException { 408 409 /** 410 * 411 */ 412 private static final long serialVersionUID = 3136681292988750961L; 413 414 public ExpressionException() { 415 super(); 416 } 417 418 public ExpressionException(String msg) { 419 super(msg); 420 } 421 422 public ExpressionException(String msg, Throwable cause) { 423 super(msg, cause); 424 } 425 426 public ExpressionException(Throwable cause) { 427 super(cause); 428 } 429 } 430 431 /** 432 * 负责读取表达式生成ExpressionNode对象的类 433 * 434 * @项目名称: sunson_pams 435 * @类名称: ExpressionParser 436 * @类描述: 437 * @创建人: 唐泽齐 438 * @创建时间: 2017年12月15日 上午9:52:59 439 * @修改人: 唐泽齐 440 * @修改时间: 2017年12月15日 上午9:52:59 441 * @修改备注: 442 * @version: 1.0 443 */ 444 public static class ExpressionParser { 445 446 // 当前分析的表达式 447 private String expression; 448 449 // 当前读取的位置 450 private int position; 451 452 public String getExpression() { 453 return expression; 454 } 455 456 public void setExpression(String expression) { 457 this.expression = expression; 458 } 459 460 public int getPosition() { 461 return position; 462 } 463 464 public void setPosition(int position) { 465 this.position = position; 466 } 467 468 public ExpressionParser(String expression) { 469 this.expression = expression; 470 this.position = 0; 471 } 472 473 /** 474 * 读取下一个表达式节点,如果读取失败则返回null 475 * 476 * @return 477 */ 478 public ExpressionNode readNode() { 479 ExpressionNode s = new ExpressionNode(null); 480 // 空格的位置 481 int whileSpacePos = -1; 482 boolean flag = false; 483 StringBuffer buffer = new StringBuffer(10); 484 while (this.position < this.expression.length()) { 485 char c = this.expression.charAt(this.position); 486 if (c == '"') { 487 flag = !flag; 488 if (!flag) { 489 this.position++; 490 buffer.append(c); 491 break; 492 } 493 if (buffer.length() != 0) { 494 break; 495 } 496 } 497 if (flag) { 498 this.position++; 499 buffer.append(c); 500 } else { 501 if (s.IsWhileSpace(c)) { 502 if ((whileSpacePos >= 0) && ((this.position - whileSpacePos) > 1)) { 503 throw new ExpressionException( 504 String.format("表达式\"%s\"在位置(%s)上的字符非法!", this.getExpression(), this.getPosition())); 505 } 506 if (buffer.length() == 0) { 507 whileSpacePos = -1; 508 } else { 509 whileSpacePos = this.position; 510 } 511 this.position++; 512 continue; 513 } 514 if ((buffer.length() == 0) || s.IsCongener(c, buffer.charAt(buffer.length() - 1))) { 515 this.position++; 516 buffer.append(c); 517 } else { 518 break; 519 } 520 if (!s.needMoreOperator(c)) { 521 break; 522 } 523 } 524 } 525 if (buffer.length() == 0) { 526 return null; 527 } 528 ExpressionNode node = new ExpressionNode(buffer.toString()); 529 if (node.getType() == ExpressionNodeType.Unknown) { 530 throw new ExpressionException(String.format("表达式\"%s\"在位置%s上的字符\"%s\"非法!", this.getExpression(), 531 this.getPosition() - node.getValue().length(), node.getValue())); 532 } 533 return node; 534 } 535 536 } 537 538 /** 539 * 解析公式并返回结果的类 540 * 541 * @项目名称: sunson_pams 542 * @类名称: ExpressionEvaluator 543 * @类描述: 544 * @创建人: 唐泽齐 545 * @创建时间: 2017年12月15日 上午9:56:08 546 * @修改人: 唐泽齐 547 * @修改时间: 2017年12月15日 上午9:56:08 548 * @修改备注: 549 * @version: 1.0 550 */ 551 public static class ExpressionEvaluator { 552 553 private ExpressionEvaluator() { 554 555 } 556 557 /** 558 * 将算术表达式转换为逆波兰表达式 559 * 560 * @param expression 561 * 要计算的表达式,如"1+2+3+4" 562 * @return 563 */ 564 private static List
parseExpression(String expression) { 565 if (StringUtils.isEmpty(expression)) { 566 return new ArrayList
(); 567 } 568 569 List
listOperator = new ArrayList
(10); 570 Stack
stackOperator = new Stack
(); 571 572 ExpressionParser expParser = new ExpressionParser(expression); 573 ExpressionNode beforeExpNode = null; // 前一个节点 574 ExpressionNode unitaryNode = null; // 一元操作符 575 ExpressionNode expNode; 576 // 是否需要操作数 577 boolean requireOperand = false; 578 579 while ((expNode = expParser.readNode()) != null) { 580 if ((expNode.getType() == ExpressionNodeType.Numeric) 581 || (expNode.getType() == ExpressionNodeType.String) 582 || (expNode.getType() == ExpressionNodeType.Date)) { 583 // 操作数, 直接加入后缀表达式中 584 if (unitaryNode != null) { 585 // 设置一元操作符节点 586 expNode.setUnitaryNode(unitaryNode); 587 unitaryNode = null; 588 } 589 590 listOperator.add(expNode); 591 requireOperand = false; 592 continue; 593 } else if (expNode.getType() == ExpressionNodeType.LParentheses) { 594 // 左括号, 直接加入操作符栈 595 stackOperator.push(expNode); 596 continue; 597 } else if (expNode.getType() == ExpressionNodeType.RParentheses) { 598 // 右括号则在操作符栈中反向搜索,直到遇到匹配的左括号为止,将中间的操作符依次加到后缀表达式中。 599 ExpressionNode lpNode = null; 600 while (stackOperator.size() > 0) { 601 lpNode = stackOperator.pop(); 602 if (lpNode.getType() == ExpressionNodeType.LParentheses) 603 break; 604 listOperator.add(lpNode); 605 } 606 if (lpNode == null || lpNode.getType() != ExpressionNodeType.LParentheses) { 607 throw new ExpressionException(String.format("在表达式\"%s\"中没有与在位置(%s)上\")\"匹配的\"(%s)\"字符!",expParser.getExpression(), expParser.getPosition())); 608 } 609 } else { 610 if (stackOperator.size() == 0) { 611 // 第一个节点则判断此节点是否是一元操作符"+,-,!,("中的一个,否则其它都非法 612 if (listOperator.size() == 0 && !(expNode.getType() == ExpressionNodeType.LParentheses 613 || expNode.getType() == ExpressionNodeType.Not)) { 614 // 后缀表达式没有任何数据则判断是否是一元操作数 615 if (ExpressionNode.IsUnitaryNode(expNode.getType())) { 616 unitaryNode = expNode; 617 } else { 618 // 丢失操作数 619 throw new ExpressionException(String.format("表达式\"%s\"在位置(%s)上缺少操作数!", 620 expParser.getExpression(), expParser.getPosition())); 621 } 622 } else { 623 // 直接压入操作符栈 624 stackOperator.push(expNode); 625 } 626 requireOperand = true; // 下一个节点需要操作数 627 continue; 628 } else { 629 if (requireOperand) { 630 // 如果需要操作数则判断当前的是否是"+","-"号(一元操作符),如果是则继续 631 if (ExpressionNode.IsUnitaryNode(expNode.getType()) && unitaryNode == null) { 632 unitaryNode = expNode; 633 } else { 634 // 丢失操作数 635 throw new ExpressionException(String.format("表达式\"%s\"在位置({1})上缺少操作数!", 636 expParser.getExpression(), expParser.getPosition())); 637 } 638 } else { 639 // 对前面的所有操作符进行优先级比较 640 do { 641 // 取得上一次的操作符 642 beforeExpNode = stackOperator.peek(); 643 644 // 如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中 645 if (beforeExpNode.getType() != ExpressionNodeType.LParentheses 646 && (beforeExpNode.getPri() - expNode.getPri()) >= 0) { 647 listOperator.add(stackOperator.pop()); 648 } else { 649 break; 650 } 651 652 } while (stackOperator.size() > 0); 653 654 // 将操作符压入操作符栈 655 stackOperator.push(expNode); 656 requireOperand = true; 657 } 658 } 659 } 660 } 661 662 if (requireOperand) { 663 // 丢失操作数 664 throw new ExpressionException( 665 String.format("表达式\"%s\"在位置({1})上缺少操作数!", expParser.getExpression(), expParser.getPosition())); 666 } 667 // 清空堆栈 668 while (stackOperator.size() > 0) { 669 // 取得操作符 670 beforeExpNode = stackOperator.pop(); 671 if (beforeExpNode.getType() == ExpressionNodeType.LParentheses) { 672 throw new ExpressionException(String.format("表达式\"%s\"中括号不匹配,丢失右括号!", expParser.getExpression(), 673 expParser.getPosition())); 674 } 675 listOperator.add(beforeExpNode); 676 } 677 678 return listOperator; 679 } 680 681 /** 682 * 对逆波兰表达式进行计算 683 * 684 * @param nodes 685 * @return 686 */ 687 @SuppressWarnings({ "rawtypes", "unchecked", "incomplete-switch" }) 688 private static Object CalcExpression(List
nodes) { 689 if (nodes == null || nodes.size() == 0) 690 return null; 691 692 if (nodes.size() > 1) { 693 int index = 0; 694 // 储存数据 695 ArrayList values = new ArrayList(); 696 while (index < nodes.size()) { 697 ExpressionNode node = nodes.get(index); 698 699 switch (node.getType()) { 700 // 如果是数字,则将值存入 values 中 701 case Numeric: 702 case String: 703 case Date: 704 values.add(node.getNumeric()); 705 index++; 706 break; 707 default: 708 // 二元表达式,需要二个参数, 如果是Not的话,则只要一个参数 709 int paramCount = 2; 710 if (node.getType() == ExpressionNodeType.Not) 711 paramCount = 1; 712 // 计算操作数的值 713 if (values.size() < paramCount) { 714 throw new ExpressionException("缺少操作数"); 715 } 716 // 传入参数 717 Object[] data = new Object[paramCount]; 718 for (int i = 0; i < paramCount; i++) { 719 data[i] = values.get(index - paramCount + i); 720 } 721 // 将计算结果再存入当前节点 722 node.setNumeric(calculate(node.getType(), data)); 723 node.setType(ExpressionNodeType.Numeric); 724 // 将操作数节点删除 725 for (int i = 0; i < paramCount; i++) { 726 nodes.remove(index - i - 1); 727 values.remove(index - i - 1); 728 } 729 index -= paramCount; 730 break; 731 } 732 733 } 734 } 735 736 if (nodes.size() != 1) { 737 throw new ExpressionException("缺少操作符或操作数"); 738 } 739 switch (nodes.get(0).getType()) { 740 case Numeric: 741 return nodes.get(0).getNumeric(); 742 743 case String: 744 case Date: 745 return nodes.get(0).getNumeric().toString().replace("\"", ""); 746 } 747 throw new ExpressionException("缺少操作数"); 748 } 749 750 /** 751 * 计算节点的值 752 * 753 * @param nodeType 754 * 节点的类型 755 * @param data 756 * 要计算的值,有可能是两位或一位数 757 * @return 758 */ 759 @SuppressWarnings("incomplete-switch") 760 private static Object calculate(ExpressionNodeType nodeType, Object[] data) { 761 double d1, d2; 762 boolean b1, b2; 763 Date time1, time2; 764 Object obj1 = data[0]; 765 Object obj2 = data[1]; 766 String str1 = obj1.toString(); 767 String str2 = obj2.toString(); 768 769 boolean dateflag = ExpressionNode.isDatetime(str1) || ExpressionNode.isDatetime(str2); 770 boolean strflag = str1.contains("\"") || str2.contains("\""); 771 str1 = str1.replace("\"", ""); 772 str2 = str2.replace("\"", ""); 773 774 switch (nodeType) { 775 case Plus: 776 if (!strflag) { 777 d1 = ConvertToDecimal(obj1); 778 d2 = ConvertToDecimal(obj2); 779 return (d1 + d2); 780 } 781 return new StringBuffer(str1 + str2).toString(); 782 case Subtract: 783 d1 = ConvertToDecimal(obj1); 784 d2 = ConvertToDecimal(obj2); 785 return d1 - d2; 786 case MultiPly: 787 d1 = ConvertToDecimal(obj1); 788 d2 = ConvertToDecimal(obj2); 789 return d1 * d2; 790 case Divide: 791 d1 = ConvertToDecimal(obj1); 792 d2 = ConvertToDecimal(obj2); 793 if (d2 == 0) 794 throw new RuntimeException(); 795 return d1 / d2; 796 case Power: 797 d1 = ConvertToDecimal(obj1); 798 d2 = ConvertToDecimal(obj2); 799 return Math.pow((double) d1, (double) d2); 800 case Mod: 801 d1 = ConvertToDecimal(obj1); 802 d2 = ConvertToDecimal(obj2); 803 if (d2 == 0) 804 throw new RuntimeException(); 805 return d1 % d2; 806 case BitwiseAnd: 807 d1 = ConvertToDecimal(obj1); 808 d2 = ConvertToDecimal(obj2); 809 return (int) d1 & (int) d2; 810 case BitwiseOr: 811 d1 = ConvertToDecimal(obj1); 812 d2 = ConvertToDecimal(obj2); 813 return (int) d1 | (int) d2; 814 case And: 815 b1 = ConvertToBool(obj1); 816 b2 = ConvertToBool(obj2); 817 return b1 && b2; 818 case Or: 819 b1 = ConvertToBool(obj1); 820 b2 = ConvertToBool(obj2); 821 return b1 || b2; 822 case Not: 823 b1 = ConvertToBool(obj1); 824 return !b1; 825 case Equal: 826 if (!dateflag) { 827 if (strflag) { 828 return str1.equals(str2); 829 } 830 d1 = ConvertToDecimal(obj1); 831 d2 = ConvertToDecimal(obj2); 832 return (d1 == d2); 833 } 834 time1 = DateUtils.parseDate(str1); 835 time2 = DateUtils.parseDate(str2); 836 837 return (time1.getTime() == time2.getTime()); 838 case Unequal: 839 if (!dateflag) { 840 if (strflag) { 841 return (!str1.equals(str2)); 842 } 843 d1 = ConvertToDecimal(obj1); 844 d2 = ConvertToDecimal(obj2); 845 return (d1 != d2); 846 } 847 time1 = DateUtils.parseDate(str1); 848 time2 = DateUtils.parseDate(str2); 849 850 return (time1.getTime() != time2.getTime()); 851 case GT: 852 853 if (!dateflag) { 854 d1 = ConvertToDecimal(obj1); 855 d2 = ConvertToDecimal(obj2); 856 return (d1 > d2); 857 } 858 time1 = DateUtils.parseDate(str1); 859 time2 = DateUtils.parseDate(str2); 860 return (time1.getTime() > time2.getTime()); 861 862 case LT: 863 864 if (!dateflag) { 865 d1 = ConvertToDecimal(obj1); 866 d2 = ConvertToDecimal(obj2); 867 return (d1 < d2); 868 } 869 time1 = DateUtils.parseDate(str1); 870 time2 = DateUtils.parseDate(str2); 871 return (time1.getTime() < time2.getTime()); 872 873 case GTOrEqual: 874 875 if (!dateflag) { 876 d1 = ConvertToDecimal(obj1); 877 d2 = ConvertToDecimal(obj2); 878 return (d1 >= d2); 879 } 880 time1 = DateUtils.parseDate(str1); 881 time2 = DateUtils.parseDate(str2); 882 return (time1.getTime() >= time2.getTime()); 883 884 case LTOrEqual: 885 if (!dateflag) { 886 d1 = ConvertToDecimal(obj1); 887 d2 = ConvertToDecimal(obj2); 888 return (d1 <= d2); 889 } 890 time1 = DateUtils.parseDate(str1); 891 time2 = DateUtils.parseDate(str2); 892 return (time1.getTime() <= time2.getTime()); 893 case LShift: 894 d1 = ConvertToDecimal(obj1); 895 d2 = ConvertToDecimal(obj2); 896 return (long) d1 << (int) d2; 897 898 case RShift: 899 d1 = ConvertToDecimal(obj1); 900 d2 = ConvertToDecimal(obj2); 901 return (long) d1 >> (int) d2; 902 case Like: 903 if (!strflag) { 904 return false; 905 } 906 return str1.contains(str2); 907 case NotLike: 908 if (!strflag) { 909 return false; 910 } 911 return !str1.contains(str2); 912 case StartWith: 913 if (!strflag) { 914 return false; 915 } 916 return str1.startsWith(str2); 917 case EndWith: 918 if (!strflag) { 919 return false; 920 } 921 return str1.endsWith(str2); 922 } 923 924 return 0; 925 } 926 927 /** 928 * 某个值转换为bool值 929 * 930 * @param value 931 * @return 932 */ 933 private static Boolean ConvertToBool(Object value) { 934 if (value instanceof Boolean) { 935 return (Boolean) value; 936 } else { 937 return value != null; 938 } 939 } 940 941 /** 942 * 将某个值转换为decimal值 943 * 944 * @param value 945 * @return 946 */ 947 private static Double ConvertToDecimal(Object value) { 948 if (value instanceof Boolean) { 949 return ((Boolean) value ? 1d : 0d); 950 } else { 951 return Double.parseDouble(value.toString()); 952 } 953 } 954 955 /** 956 * 957 * @param expression 958 * 要计算的表达式,如"1+2+3+4" 959 * @return 返回计算结果,如果带有逻辑运算符则返回true/false,否则返回数值 960 */ 961 public Object eval(String expression) { 962 return CalcExpression(parseExpression(expression)); 963 } 964 965 public Object evalThreeOperand(String expression) { 966 int index = expression.indexOf("?"); 967 if (index > -1) { 968 String str = expression.substring(0, index); 969 String str2 = expression.substring(index + 1); 970 index = str2.indexOf(":"); 971 972 if (Boolean.parseBoolean((CalcExpression(parseExpression(str))).toString())) { 973 return eval(str2.substring(0, index)); 974 } 975 return eval(str2.substring(index + 1)); 976 } 977 return CalcExpression(parseExpression(expression)); 978 } 979 980 } 981 982 // /** 983 // * 测试 984 // * 985 // * @方法名:main 986 // * @参数 @param args 987 // * @返回类型 void 988 // */ 989 // public static void main(String[] args) { 990 // String s1 = "1+2+3+4"; 991 // System.out.println(ExpressionEvaluator.eval(s1)); 992 // 993 // String s2 = "(20 - 6) < 3"; 994 // System.out.println(ExpressionEvaluator.eval(s2)); 995 // 996 // String s3 = "(3 + 1) == 4 && 5 > (2 + 3)"; 997 // System.out.println(ExpressionEvaluator.eval(s3)); 998 // 999 // String s4 = "\"hello\" == \"hello\" && 3 != 4";1000 // System.out.println(ExpressionEvaluator.eval(s4));1001 //1002 // String s5 = "\"helloworld\" @ \"hello\" && \"helloworld\" !@ \"word\" ";1003 // System.out.println(ExpressionEvaluator.eval(s5));1004 //1005 // }1006 1007 }

 

转载于:https://www.cnblogs.com/tangzeqi/p/8046732.html

你可能感兴趣的文章
js时间戳怎么转成日期格式
查看>>
div宽度设置无效问题解决
查看>>
【ArcGIS Server 开发系列】Flyingis六大系列讲座精品PDF奉献
查看>>
SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据...
查看>>
3大主流NoSQL数据库性能对比测试报告
查看>>
pandas.DataFrame对行和列求和及添加新行和列
查看>>
【转载】后缀自动机学习总结
查看>>
YTU 2896: J--Zipper
查看>>
jQuery 源码分析 7: sizzle
查看>>
程序员如何打造属于自己的云笔记服务
查看>>
Hadoop守护进程【简】
查看>>
VMware ESXi-6.7——使用
查看>>
Java中map集合系列原理剖析
查看>>
Python Tornado初学笔记之数据库(二)
查看>>
二叉树C语言
查看>>
jQuery操作json数据
查看>>
记忆讲师石伟华微信公众号2018所有文章汇总(待更新)
查看>>
Vue2.0选中当前鼠标移入移除加样式
查看>>
迷宫C描述——栈的举例
查看>>
Html5 tips
查看>>