Как использовать REGEXP_REPLACE для удаления параметров из функции?

Изображение здесь

У меня есть столбец, в котором хранятся коды С#, как удалить последние 3 параметра «FunctionA»? Обратите внимание, что столбец содержит несколько функций, но мне нужно только заменить «FunctionA» с помощью PL/SQL, я знаю, что REGEXP_REPLACE может помочь, но я не могу найти способ сопоставить/заменить его.

До:

Test=FunctionA(varID, 1234,"", A.B,"","","last");

Test=FunctionA(varID, 9876,"", C.D);

Test=FunctionB(varID, 5555,"", E.F,"","","last");

После:

Test=FunctionA(varID, 1234,"", A.B);

Test=FunctionA(varID, 9876,"", C.D);‹- не должно влиять на это

Test=FunctionB(varID, 5555,"", E.F,"","","last");‹- не должно влиять на это


person Wakaboom    schedule 25.05.2018    source источник
comment
Я хотел бы добавить, что значения параметров функции различаются для каждой записи, поэтому я не могу использовать функцию REPLACE; Мне нужно какое-то сопоставление с образцом и удалить последние 3 параметра только для FunctionA   -  person Wakaboom    schedule 25.05.2018
comment
Пожалуйста, отредактируйте свой исходный пост и включите в обычный текст данные до, как показано на изображении. Как правило, никогда не используйте изображения, поскольку люди, пытающиеся помочь, не могут копировать/вставлять для получения демонстрационных данных. Может ли строка, с которой вам нужно манипулировать, встречаться в блоке данных более одного раза? Включают ли эти данные возврат каретки/перевод строки или это одна длинная строка?   -  person Gary_W    schedule 25.05.2018


Ответы (1)


Попробуйте найти этот шаблон:

(,[^,]*,[^,]*,[^,]*\);)$

А затем замените только );. Вот пример запроса:

SELECT
    REGEXP_REPLACE ('Test=FunctionA(varID, 1234,"", A.B,"","","last");',
        '(,[^,]*,[^,]*,[^,]*\);)$', ');') AS output
FROM dual
WHERE col LIKE 'Test=FunctionA(%'

Test=FunctionA(varID, 1234,"", A.B);

Демо

Изменить: я добавил предложение WHERE, которое проверяет имя функции.

person Tim Biegeleisen    schedule 25.05.2018
comment
Спасибо, это очень близко, но это влияет на все другие функции в примере записи ниже... SELECT REGEXP_REPLACE ('Test=FunctionA(varID, 1234,, A.B,,,last); Test=FunctionB(varID, 1234,, A.B,, ,последний); ','(,[^,]*,[^,]*,[^,]*);)$', ');') КАК вывод ИЗ двойного, как вы можете ориентироваться только на FunctionA? - person Wakaboom; 25.05.2018
comment
@Wakaboom Может быть способ изменить шаблон, который я использовал в REGEXP_REPLACE, но, честно говоря, я мог бы просто добавить предложение WHERE, которое проверяет имя функции, чтобы не рисковать. - person Tim Biegeleisen; 25.05.2018
comment
Согласитесь, простого предложения WHERE достаточно, чтобы «ударить себя по голове». Пока все хорошо, все еще играю с регулярным выражением, которое вы даете, но еще не разрешили в реальной среде. Опубликую решение, как только найду его. - person Wakaboom; 25.05.2018
comment
Will post a solution once I found it ... Я уже нашел его, по крайней мере, исходя из вашего вопроса. Если нет, то следует отредактировать свой вопрос. - person Tim Biegeleisen; 25.05.2018
comment
SELECT REGEXP_REPLACE ( 'Test=FunctionA(varID, 1234,, A.B,,,last); Test=FunctionB(varID, 1234,, A.B,,,last); Test=FunctionA(varID, 1234,, A.B,,,last) );', '([FunctionA](varID, 1234,,[^,]AB,[^,]*,[^,]*,[^,]*);)', ');') AS вывод ОТ Dual я получаю следующее, что неверно... Test=Function); Test=FunctionB(varID, 1234,, A.B,,,last); Тест=Функция); Как я могу получить нижеследующее, изменив приведенный выше скрипт?.. Test=FunctionA(varID, 1234,, A.B); Test=FunctionB(varID, 1234,, A.B,,,last); Test=FunctionA(varID, 1234,, A.B); - person Wakaboom; 25.05.2018
comment
@Wakaboom Если я ответил на точный вопрос, который вы задали, и / или я был очень близок к тому, что вы на самом деле использовали, то вы должны отметить этот ответ как правильный. - person Tim Biegeleisen; 25.05.2018
comment
Конечно, извините, впервые используя этот сайт, я не знал, что должен это сделать - person Wakaboom; 25.05.2018