Я получаю выражение из базы данных, как "Category==BWFULL && Channel==ANDROID && ver > 200"
. Теперь я получаю от пользователя любые значения категории, канала и версии. Я должен подтвердить этот вклад с помощью приведенного выше выражения. Я могу сделать это с несколькими, если еще условие. Но я не хочу этого делать. Есть ли лучший способ оценить это выражение.
Также я не могу сделать с регулярным выражением, потому что не знаю, как обрабатывать ver> 200.
Необходимо уточнить, что! =,> =, <=, ==,>, <присутствуют в выражении, а значения этих категорий, каналов и версий являются динамическими. </p>
На самом деле я не хочу использовать стороннюю библиотеку для этого. Я думаю, что ScriptManager может быть в состоянии выполнить, но выражение должно быть "Category == \" BWFULL \ "&& Channel == \" ANDROID \ "&& ver> 200".
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("Category", "BWFULL");
engine.put("ver",90);
engine.put("Channel","ANDROID");
Но для этого я должен поставить кавычки в этом выражении, которое я хочу пропустить. Также потребуется некоторое время для оценки. Так есть ли другое решение.
Теперь я использую выражение regexExpression, как
Pattern.matches("([a-zA-Z]+ *== *NMW *&&)( *[a-zA-Z]+ *== *android +&&)( *[a-zA-Z]+ *== *nitrogen)", "walletcategory == NMW && channel ==android && ghb == nitrogen")
Но все же проблема со значением> 200 или также с заказом. В приведенном выше регулярном выражении порядок выражения является статическим, но я хочу его в любом порядке.
Теперь, потратив немного усилий, я нашел решение с использованием регулярных выражений.
public class Main {
public static void main(String[] args) {
//
String str = "walletcategory == NMW && asdfs == airtel && ghb == nitrogen && val >= 200";
Pattern regex = Pattern.compile("[(>=)(==)(!=)(<=)]{2}|[(<)(>)]");
evaluateTimeForForLoop(str, regex);
}
private static void evaluateTimeForForLoop(String str, Pattern regex) {
long startTime = System.nanoTime();
String[] strArr = str.split("&&");
int len = strArr.length;
String input[] = {"NMW","airtel","nitrogen"};
for(int i = 0; i < len-1 ;i++) {
String opee = strArr[i];
String op = extractOperatorFromString(opee,regex);
if(op != null) {
String right = opee.substring(opee.indexOf(op)+op.length(),opee.length()).trim();
System.out.println(evaluate(input[i], op, right));
}
}
String str3 = strArr[3];
String operator = extractOperatorFromString(str3,regex);
if(operator != null) {
String right = str3.substring(str3.indexOf(operator)+operator.length(),str3.length()).trim();
System.out.println(evaluate(100, operator, Integer.parseInt(right)));
}
long endTime = System.nanoTime();
System.out.println(endTime - startTime);
}
private static String extractOperatorFromString(String str, Pattern regex) {
try {
Matcher regexMatcher = regex.matcher(str);
boolean bool = regexMatcher.matches();
if (regexMatcher.find()) {
return regexMatcher.group();
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
return null;
}
private static boolean evaluate(int left, String op, int right)
{
switch (op)
{
case "==":
return left == right;
case ">":
return left > right;
case "<":
return left < right;
case "<=":
return left <= right;
case ">=":
return left >= right;
case "!=":
return left != right;
default:
System.err.println("ERROR: Operator type not recognized.");
return false;
}
}
private static boolean evaluate(String left, String op, String right)
{
switch (op)
{
case "==":
return left.equals(right);
case "!=":
return !left.equals(right);
default:
System.err.println("ERROR: Operator type not recognized.");
return false;
}
}
}
Но все еще жду ответа, если есть лучший способ сделать это с помощью регулярных выражений.