В чем-то вроде следующего кода я хочу извлечь только функцию, которая имеет более одного параметра, и хочу игнорировать объединение, которое имеет 2 параметра. Пожалуйста, помогите, я работал над этим в течение нескольких дней, используя REGEX, и думаю, что возможно просто не то, что я смог обернуть вокруг себя. Я полагаю, что ответом является группа, и разбор этой группы с под-регулярным выражением или чем-то в этом роде.
AND NOT COALESCE(UPPER(FUNCTION_TO_FIND(B.PARAM, B.TEST_PARAM1, B.TEST_PARAM2, B.TEST_PARAM3,'Routine Type', ATT_TO_DATE())),'NO_VALUE') IN (UPPER('Routine Appointment Letter'))
AND NOT UPPER(DBO.FUNCTION_TO_FIND( B.PARAM , B.TEST_PARAM1 , B.TEST_PARAM2, B.TEST_PARAM3,'Routine Type', ATT_TO_DATE())) IN (UPPER('Routine Appointment Letter'))
AND NOT COALESCE(1, 3) = 2
Я ожидал бы найти
DBO.FUNCTION_TO_FIND( B.PARAM , B.TEST_PARAM1 , B.TEST_PARAM2, B.TEST_PARAM3,'Routine Type', ATT_TO_DATE())
и
FUNCTION_TO_FIND(B.PARAM, B.TEST_PARAM1, B.TEST_PARAM2, B.TEST_PARAM3,'Routine Type', ATT_TO_DATE())
Обратите внимание, что функции не всегда будут иметь одинаковое количество слоев вниз, но все они будут иметь более двух параметров.
Я пробовал разные версии и правки следующей сбалансированной скобки функции, но он не смог правильно рассчитать параметры для захвата всей функции.
(\((?>[^()]|(?1))*\))
РЕДАКТИРОВАТЬ, УТОЧНИТЬ НИЖЕ
EDIT1: обратите внимание, что при поиске функций у меня не будет доступа к серверу, с которым будет работать SQL, это должно быть сделано полностью в автономном режиме.
EDIT2: Думая об этом дальше, я думаю что эту проблему нужно решить в нескольких частях, а не в одном регулярном выражении, используя другой инструмент для создания регулярного выражения на лету.
- Создайте список функций, которые я надеваю не хотите найти общие TO_CHAR, TO_NUMBER, UPPER, LOWER, COALESCE, MIN, MAX и AND, EXISTS, COALESCE, SUM, FROM
- Найти начало любой функции, которая используется в строке запроса, используя что-то вроде следующего.
[[:alnum:]][^)( \r\n]+?\s*?\(
- Сделайте резервную копию одного символа в строке и используйте следующий код, чтобы найти соответствующие круглые скобки.
(\((?>[^()]|(?1))*\))
- ...
Я попробую что-то с вышеприведенным эффектом и вернусь с ответом. В то же время, если у кого-то есть другая идея, пожалуйста, не стесняйтесь вносить свой вклад.