我会有一个类似
的字符串('abc' != 'xyz' AND 'thy' = 'thy') OR ('ujy' = 'ujy')
String可以拥有任意数量的“AND”组。 AND组中不会有任何嵌套组。所有组都将始终通过OR进行交换。
我可以关闭&&
的AND和||
的OR。
我想要将此String传递给某种类型的eval方法并输出TRUE或FALSE。
那里有什么可以做到的吗?
答案 0 :(得分:14)
您可以使用JDK1.6附带的内置Javascript引擎来评估包含数学表达式的字符串。
您可以在此处查找:ScriptEngine
这是一个例子:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Myclass {
public static void main(String[] args) {
try {
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");
String myExpression = "('abc' == 'xyz' && 'thy' == 'thy') || ('ujy' == 'ujy')";
System.out.println(se.eval(myExpression));
} catch (ScriptException e) {
System.out.println("Invalid Expression");
e.printStackTrace();
}
}
}
请记住替换以下内容:
'AND'与'&&',
'或'与'||',
'='必须是'=='
否则它将不接受您的表达式并将抛出javax.script.ScriptException
答案 1 :(得分:2)
你可以使用script
包来实现这个目标,如
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
String[] vars = {"var1 = 'xyz'", "var2 = 'xyz'"};
try {
for (String var : vars) {
engine.eval(var);
}
System.out.println(engine.eval("var1 == var2 "));
} catch (ScriptException e) {
e.printStackTrace();
}
答案 2 :(得分:1)
我认为你必须解析它并像这样编写自定义类
public interface StringEquals{
public boolean equals(String s1, String s2);
}
public class Equals implements StringEquals{
private String mS1;
private STring mS2;
public NotEquals(String s1, String s2){
mS1 = s1;
mS2 = s2;
}
public boolean equals(){
return mSq1.equals(mS2);
}
}
public class NotEquals implements StringEquals{
private String mS1;
private STring mS2;
public NotEquals(String s1, String s2){
mS1 = s1;
mS2 = s2;
}
public boolean equals(){
return !mS1.equals(mS2);
}
}
public class AndGroup{
private List<StringEquals> mStrings;
public AndGroup(List<StringEquals> list){
mStrings = list;
}
public boolean getResult(){
for(StringEquals e: mStrings){
if (!e.equals()){
return false;
}
}
return true;
}
and a class to parse it:
public boolean eval(String evalString){
List<AndGroup> groups = new LinkedList<AndGroup>();
String[] ands = evalString.split("OR");
for (String andExp : ands){
List<StringEquals> list = new LinkedList<StringEquals>();
String compares = andExp.split("AND");
for (String comp: compares){
if (comp.contains("!="){
String[] notEqual = comp.split("!=");
list.add(new NotEquals(notEqual[0], notEqual[1]));
} else {
String[] equal = comp.split("=");
list.add(new Equals(equal[0], equal[1]);
}
}
groups.add(new AndGroup(list));
}
for (AndGroup g: groups){
if (g.getResult()){
return true;
}
}
return false;
}
没有经过测试,但它可能会指向正确的方向
答案 3 :(得分:0)
我认为你可以尝试groovy(如果它是你的选择)和它的groovy.util.Eval,但首先你应该处理你的字符串并用&amp;&amp;替换AND \ OR和||。