gpt4 book ai didi

Java Apache JEXL boolean 表达式问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:22 24 4
gpt4 key购买 nike

我正在用 Java 开发一个系统来检查文本中关键字组合的出现情况。例如,我要检查以下表达式: ( Yellow || red ) && couch 。 我把工作分成两步。第一个是检测文本中的单个单词。 第二种是使用结果来检查 boolean 表达式。 经过短暂的网络搜索后,我选择了 Apache JEXL。

// My web app contains a set of preconfigured keywords inserted by administrator: 
List<String> system_occurence =new ArrayList<String>() {{
add("yellow");
add("brown");
add("red");
add("kitchen");
add("sofa");
}};


// The method below check if some of system keywords are in the text
List<String> occurence = getOccurenceKeywordsInTheText();
for ( String word :occurrence){
jexlContext.set(word,true);
}

// Set to false system keywords not in the text
system_occurence.removeAll(occurence);
for ( String word :system_occurence){
jexlContext.set(word,false);
}


// Value the boolean expression
String jexlExp ="( yellow || red ) && sofa";
JexlExpression e = jexl.createExpression( jexlExp_ws_keyword_matching );

Boolean o = (Boolean) e.evaluate(jexlContext);

在上面的示例中,我在 boolean 表达式中使用了简单的单词。对于 ASCII 和非复合词我没有任何问题。我在 boolean 表达式中遇到非 ASCII 和复合关键字的问题,因为我无法将它们用作变量名称。

// The below example fails, JEXL launch Exception
String jexlExp ="( Lebron James || red ) && sofa";

// The below example fails, JEXL launch Exception
String jexlExp ="( òsdà || red ) && sofa";

如何解决?我的方法对吗?

抱歉我的英语不好:)

最佳答案

尝试用其他字符(例如下划线 (_))替换空格。

package jexl;



import org.apache.commons.jexl3.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test2 {

private static final JexlEngine JEXL_ENGINE = new JexlBuilder().cache(512).strict(false).silent(false).create();
public static void main(String[] args) {
// My web app contains a set of preconfigured keywords inserted by administrator:
List<String> system_occurence =new ArrayList<String>() {{
add("yellow");
add("brown");
add("red");
add("kitchen");
add("sofa");
}};

JexlContext jexlContext = new MapContext();

// The method below check if some of system keywords are in the text
List<String> occurence = Arrays.asList("kitchen");
for ( String word :occurence){
jexlContext.set(word,true);
}

// Set to false system keywords not in the text
system_occurence.removeAll(occurence);
for ( String word :system_occurence){
jexlContext.set(word,false);
}


// Value the boolean expression
String jexlExp ="( Lebron_James || red ) && sofa";
JexlExpression e = JEXL_ENGINE.createExpression( jexlExp );

Boolean o = (Boolean) e.evaluate(jexlContext);

System.out.println(o);
}

}

关于Java Apache JEXL boolean 表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38222203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com