java - 如何将String逻辑表达式转换为java可执行表达式

标签 java parsing

不幸的是,这有点丑陋。我有一个以某种格式编写的字符串,该字符串作为约束发送到数据库。它看起来像这样:

String constraint = "((attr1 eq 1) OR (attr2 eq 5)) AND (attr3 BETWEEN (1, 5))"

我需要一种将其解析为流过滤器的方法,如下所示:

stream.filter(obj -> 
    (obj.getAttr1() == 1 || obj.getAttr2() == 5) && (isBetween(obj.getAttr3(), 1, 5)))

isBetween 方法在其他地方可以确定 attr3 值是否在 1 到 5 之间。有没有简单的方法来解析它?

有多个过滤器调用应该没问题,而不是将其全部放入一个过滤器调用中。决定使用哪个 getAttr 可以在 if 语句中按照以下方式完成:

if (attr.equals("attr1")) {
    obj.getAttr1();
}

最佳答案

您可能希望查看EvalEx 。它是一个通用的表达式解析器和评估器。

您可以定义自己的运算符,因此“eq”、“and”和“or”应该不成问题。您可以创建变量,因此“attr1”和 friend 也不应该成为问题。

这可能是问题所在:

attr3 BETWEEN (1, 5)

不确定是否可以定义一个在右侧接受多个参数的运算符,或者一个返回后缀运算符的函数。但源代码是可用的,所以也许你可以破解一个。

关于java - 如何将String逻辑表达式转换为java可执行表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36897021/

相关文章:

Java JNI 调用比预期慢(至少 2 毫秒/调用)

java - 如何在 Tomcat 停止时停止执行程序线程?

java - CheckBoxTreeTableCell 选择父事件下的所有子项

java - Stanford Dependency Parser - 如何获得跨度?

java - servlet容器如何为多个 "first"请求实例化 session ?

php - 解析 Json 对象 PHP

php - 使用 php ping 一个 ip,结果只有平均响应时间。

python - XPath 或 BeautifulSoup (或其他方式)来选择和解析某个 div block

parsing - Powershell删除第一个特殊字符实例后的文本

java - 正则表达式匹配-Java