Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串作为条件进行求值_Java_String_Parsing - Fatal编程技术网

Java 将字符串作为条件进行求值

Java 将字符串作为条件进行求值,java,string,parsing,Java,String,Parsing,我必须从D/B中检索一组列值,并将其作为一个条件进行检查 例如,我将在D/B列中包含像“value>2”,“42){doSomething();}中断; 案例“4value>4 与您提供的方法相比,这带来了许多好处 改进的性能和清洁度 您的条件可以在数据库级别进行评估,并可用于筛选查询 您不必担心处理伪代码语法被破坏的场景 除了使用Java 7之外,还有一个很好的方法就是使用枚举。 声明枚举,如下所示 上面的枚举有一组常量,这些常量的值设置为您期望从数据库返回的字符串。由于您可以在交换机情况下

我必须从D/B中检索一组列值,并将其作为一个条件进行检查

例如,我将在D/B列中包含像
“value>2”
“4
这样的字符串。(值是一直比较的值)。我将在我的代码中声明一个变量值,我应该计算这个条件

int value = getValue();
if (value > 2)  //(the string retrieved from the D/B)
  doSomething();

我该怎么做??非常感谢您的帮助。谢谢。

这不会很简单:您需要一个解析器来解析数据库中使用的表达式语言。如果是某种标准的、指定良好的语言,那么您可能可以在Internet上找到一种,但是如果是内部语言,那么您可能需要编写自己的语言(可能需要使用像ANTLR这样的解析器生成器)


该包包含一些用于集成外部脚本引擎(如Javascript解释器)的工具。另一种方法是引入脚本引擎并将表达式提供给该引擎。

您基本上是在计算脚本表达式。根据该表达式中允许的内容,可以使用非常简单(识别组的正则表达式)或非常复杂(嵌入javascript引擎?)的内容

我假设你在看一个简单的例子,表达式是: [boundary0][operator]“value”[operator][boundary1]

其中可以省略一个,但不能同时省略两个[边界][运算符]组。(如果两者都存在,则操作员应相同)

我将使用正则表达式来捕获组

类似于:(?:(\d+)\s*([])\s*)?值(?:\s*([])\s*(\d+)

然后:
边界1=组(1);操作员1=组(2);操作者2=组(3);boundary2=group(4)

最新版本的java(java 7)允许在字符串上使用Switch-Case语句,如果没有太多可能的变体,您可以执行以下操作或类似操作:

int value = getValue();
switch(myString) {
  case "value > 2" : if (value > 2) {  doSomething();} break;
  case "4 < value < 6" : if (value > 4 && value < 6) {  doSomethingElse();} break;
  default : doDefault();
}
int value=getValue();
开关(myString){
案例“value>2”:如果(value>2){doSomething();}中断;
案例“44&&value<6){doSomethingElse();}中断;
默认值:doDefault();
}

您应该尝试通过执行以下操作来解析if语句中的字符串

if(parseMyString(getValue()))
    doSomething();

在parseMyString中,您可以确定需要为条件计算什么。如果您不知道如何创建解析器,请查看:

下面是一个使用标准(Java 1.6+)脚本库的示例:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        engine.eval("value = 10");
        Boolean greaterThan5 = (Boolean) engine.eval("value > 5");
        Boolean lessThan5 = (Boolean) engine.eval("value < 5");

        System.out.println("10 > 5? " + greaterThan5); // true
        System.out.println("10 < 5? " + lessThan5); // false
    }
}
导入javax.script.ScriptEngine;
导入javax.script.ScriptEngineManager;
公开课考试{
公共静态void main(字符串[]args)引发异常{
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine=factory.getEngineByName(“JavaScript”);
发动机评估(“值=10”);
Boolean greaterThan5=(Boolean)engine.eval(“value>5”);
布尔lessThan5=(布尔)engine.eval(“值<5”);
System.out.println(“10>5?”+greaterThan5);//true
System.out.println(“10<5?”+lessThan5);//false
}
}

要以最大的灵活性评估条件,请使用为嵌入而设计的脚本语言,例如,可以解析和评估问题中的简单条件表达式


使用MVEL比使用Java 1.6+中的脚本引擎(特别是JavaScript)有一个巨大的优势:使用MVEL,您可以将脚本编译成字节码,使其在运行时的计算效率更高。

这本身并不能回答您的问题;它提供了一种可能影响相同结果的替代解决方案

与使用定义条件的伪代码存储单个数据库列不同,创建一个表,其中模式定义必须满足的条件类型和这些条件的值。这简化了对这些条件的编程评估,但如果要评估各种类型的条件,则可能会变得复杂

例如,您可能有一个如下所示的表

CONDITION_ID | MINIMUM | MAXIMUM | IS_PRIME  |   ETC.
______________________________________________________
      1      |    2    |   NULL  |   NULL    |   ...
      2      |    4    |    6    |   NULL    |   ...
这些行条目分别映射到规则
value>2
6>value>4

与您提供的方法相比,这带来了许多好处

  • 改进的性能和清洁度
  • 您的条件可以在数据库级别进行评估,并可用于筛选查询
  • 您不必担心处理伪代码语法被破坏的场景

除了使用Java 7之外,还有一个很好的方法就是使用枚举。 声明枚举,如下所示

上面的枚举有一组常量,这些常量的值设置为您期望从数据库返回的字符串。由于您可以在交换机情况下使用枚举,所以剩下的代码变得很容易

enum MyEnum
{
    val1("value < 4"),val2("4<value<6");
    private String value;

    private MyEnum(String value)
    {
        this.value = value;
    }
}


public static void chooseStrategy(MyEnum enumVal)
{   
    int value = getValue();
    switch(enumVal)
    {
        case val1:
        if(value > 2){}
        break;
        case val2:
        if(4 < value && value < 6) {}
        break;
        default:
    }
}

public static void main(String[] args)
{
    String str = "4<value<6";
    chooseStrategy(MyEnum.valueOf(str));
}
enum MyEnum
{

val1(“值<4”),val2("4我建议找到更好的方法,否则必须使用反射。这些示例是唯一的表达式类型吗?字符串有多复杂?您可以解析每种类型,获取标记并使用它们来计算表达式。感谢您的输入。是的,只有这些类型的表达式将被计算。您也可以想看一看这个问题:谢谢你的输入。是的,只有这些类型的表达式会被计算。我已经做java多年了,没有一个月不学习新东西。我不确定这是好是坏。它在LOC:engine.eval(“value=10”)上抛出一个NullPointerException;可能的原因是什么?@venkateshwarraosurabii我没有收到这个错误-这可能意味着
引擎
为空。您使用的是Java 1.6+?引擎名称中没有输入错误:“JavaScript”的大写字母J和S?很抱歉,我不知道我应该单击检查。感谢您的帮助。:)我认为Bob Martin叔叔的脑袋爆炸了。如果欢迎的话,我会提供一些反馈:当OP谈到从数据库中提取字符串时,您的方法使用了大量代码,并且不够动态/灵活。如果