Регулярное выражение для подготовленных утверждений

#java #regex #oracle #prepared-statement

#java #регулярное выражение #Oracle #подготовленный оператор

Вопрос:

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

В качестве доказательства концепции я пытаюсь придумать регулярное выражение для методов установки, найденных в приведенной выше ссылке, например: setString() , SetInt() и т.д..

Операторы setter могут иметь 2 или более аргументов вместе с позицией параметра.

 setDate(int parameterIndex, Date x, Calendar cal)
setInt(int parameterIndex, int x)
  

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

 tell me which setter method it is 
get the parameter position
get the associated values (including blank/empty string )
  

Я пробовал с этим

 set[A-Z]. ([1-9] ,.*,.*)
  

Это работает частично, сбой происходит только для 2 аргументов. Пустые значения также не распознаются.

Ответ №1:

Это должно быть что-то вроде этого:

 set(w )((d )(,[^,] ) )
  
  1. set(w ) — выполняет поиск ‘set’ со следующими символами и возвращает следующие символы в качестве первой группы.
  2. (....) — поиск (…). является управляющим символом
  3. (d ) — находит числа и возвращает их как вторую группу
  4. ,[^,] — находит и после 1 или более любых символов, кроме запятой
  5. (,[^,] ) — находит предыдущие группы с запятой без запятой, повторяющиеся более 1 раза, и возвращает последнюю из них в виде группы # 3

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

1. Я не думаю, что оно соответствует каждому параметру. Каждый параметр не находится внутри группы: regex101.com/r/JVyPbj/2 . Я думаю, что есть что-то, чего я не понимаю, как работает ваше регулярное выражение… Оно должно соответствовать 2 or more arguments . Не могли бы вы привести пример ваших тестов для этого регулярного выражения?

2. @vincentPHILIPPE Я не понял, что именно вам непонятно? Даже по предоставленной ссылке вы можете найти, что setDate(1) возвращает Your regular expression does not match the subject string. . Измените его на setDate(1,2) , и вы получите Match 1...

3. @vincentPHILIPPE первый параметр соответствует группе 2 и (,[^,] ) проверяет, существует ли одна или несколько групп «запятая не запятая»

4. @vincentPHILIPPE если вы хотите получить их все в виде подвыражения, вы можете просто обернуть это выражение в (), т.е. set(w )(((d )(,[^,] ) ))

5. @SayanMalakshinov, Это хорошо работает только с 2 аргументами, пример — setString(1, значение) => соответствует 1 и «, значение» setString(1, фамилия, имя) == > не соответствует «фамилия»