Как выполнить выражение с логическим оператором в строке, если это возможно, используя регулярное выражение - PullRequest
0 голосов
/ 04 мая 2018

Я получаю выражение из базы данных, как "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;
            }
    }

}

Но все еще жду ответа, если есть лучший способ сделать это с помощью регулярных выражений.

1 Ответ

0 голосов
/ 04 мая 2018

Эти три варианта статичны или нет? Если у вас всегда есть категория, канал и версия, вы можете просто изменить базу данных на:

requiredCategory
requiredChannel
requiredMinimalVersion (due to > 200)

, а затем просто сравните их с пользовательскими параметрами. Но я бы предпочел не хранить никаких ограничений в одной строке, как вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...