#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 )(,[^,] ) )
set(w )
— выполняет поиск ‘set’ со следующими символами и возвращает следующие символы в качестве первой группы.(....)
— поиск (…).(d )
— находит числа и возвращает их как вторую группу,[^,]
— находит и после 1 или более любых символов, кроме запятой(,[^,] )
— находит предыдущие группы с запятой без запятой, повторяющиеся более 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, фамилия, имя) == > не соответствует «фамилия»