Почему синтаксис для использования регулярных выражений, который работает в приложении «Тренажер», не работает в jsonata4java?

#java #regex #jsonata

Вопрос:

Я пытаюсь использовать jsonata4java, используя оператор $match и регулярное выражение в предикате.

Код jsonata был успешно протестирован в приложении JSonata Exerciser, но в моем тесте java произошел сбой с сообщениями об ошибках, которые, по-видимому, поступают от antlr (лексера/синтаксического анализатора). Тренажер использовался с одинаковыми входными данными.

Что было попробовано: 1) Обновление до последней версии jsonata4java (1.0.5). 2) Различные способы экранирования определенных символов (снятых в темноте) 3) упрощение выражения 4) использование стиля лямбда в предикате (tin ~> /регулярное выражение/) вместо соответствия 5) пошаговое выполнение некоторого сгенерированного кода синтаксического анализа

     public void test() {
        try {
            Expressions expr = null;
            ObjectMapper mapper = new ObjectMapper();
                JsonNode jsonObj = null;
                String json = "{"id":"1234"}";
                String expression = "$[$match(id, /1234/)].id";
//              String expression = "$.id";
                System.out.println("Expression: "   expression);
                jsonObj = mapper.readTree(json);
                expr = Expressions.parse(expression);
                JsonNode jsonResult = expr.evaluate(jsonObj);
                System.out.println(""   mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonResult));
        }
        catch(Throwable th) {
            System.out.println(th.getMessage());
        }
    }
 

Я ожидал, что этот код просто отобразит атрибут «id», «1234». Вместо этого он создает исключение при выполнении Expressions.parse(выражение). Текст сообщений об ошибках выглядит следующим образом:

 Expression: $[$match(id, /1234/)].id

line 1:2 at [@1,2:2='[',<16>,1:2]: missing '.' at '[',
line 1:14 at [@6,14:14='/',<29>,1:14]: no viable alternative at input '$match(id,/', 
line 1:14 at [@6,14:14='/',<29>,1:14]: extraneous input '/' expecting {'(', 
'true', 'false', STRING, 'null', '[', '{', '

Эй, я давно здесь не публиковался, спасибо за помощь.


Комментарии:

1. Кроме того, в качестве элемента управления я протестировал закомментированное выражение, которое не содержит кода соответствия/регулярного выражения, и упрощенное выражение работало так, как ожидалось.

2. Похоже, регулярное выражение еще не было реализовано в версии Java - github.com/IBM/JSONata4Java#current-limitations

3. Спасибо, Эндрю, я ценю твою помощь.

, '$', NUMBER, 'function', '-', '$each', '$sift', '$reduce', '$filter', '$map', VAR_ID, ID}, line 1:20 at [@9,20:20=')',<4>,1:20]: no viable alternative at input '1234/)'
Эй, я давно здесь не публиковался, спасибо за помощь.

Комментарии:

1. Кроме того, в качестве элемента управления я протестировал закомментированное выражение, которое не содержит кода соответствия/регулярного выражения, и упрощенное выражение работало так, как ожидалось.

2. Похоже, регулярное выражение еще не было реализовано в версии Java — github.com/IBM/JSONata4Java#current-limitations

3. Спасибо, Эндрю, я ценю твою помощь.