Как заменить строку, которая начинается и заканчивается набором «специальных» символов (тегов) - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть текстовый блоб Firebird 3.x с таким текстом:

This is an {START example a=b}. The {duck} is big.

Я хочу заменить все {START _____} на (#_____#). В позиции _____ должен находиться текст, который находится между "{START" и "}". В этом примере результат будет следующим:

This is an (#example a=b#). The {duck} is big.

Обратите внимание, что закрывающая скобка после слова "утка" не должна заменяться, поскольку перед "уткой" нет "{START".

Как это сделать?

1 Ответ

2 голосов
/ 28 апреля 2020

Подобные вещи возможны в Firebird, но они немного запутаны. Возможно, вы захотите сделать это на выбранном вами языке программирования.

В Firebird вы можете использовать POSITION, чтобы найти маркер начала и конца, а затем использовать SUBSTRING и объединение для перестроения строки.

Используя эти функции, вы можете создать свою собственную PSQL функцию :

create or alter function replace_tags(input_value blob sub_type text) returns blob sub_type text
as
declare temp blob sub_type text = '';
declare start_tag char(7) = '{START ';
declare end_tag char(1) = '}';
declare start_replacement char(2) = '(#';
declare end_replacement char(2) = '#)';
declare search_start integer = 1;
declare start_position integer;
declare end_position integer;
begin
    while (true) do
    begin
        -- Search for occurrence of start-tag '{START ' 
        start_position = position(start_tag, input_value, search_start);
        if (start_position = 0) then leave;

        -- Search for occurrence of end-tag '}' after start-tag
        end_position = position(end_tag, input_value, start_position + 7);
        if (end_position = 0) then leave;

        temp = temp
             -- Add text before start-tag (and after previous end-tag found)
             || substring(input_value from search_start for start_position - search_start)
             -- Add replacement start-tag
             || start_replacement
             -- Add text between start-tag and end-tag
             || substring(input_value from start_position + 7 for end_position - start_position - 7)
             -- Add replacement end-tag
             || end_replacement;

        -- Setup for next search or finding remainder of string
        search_start = end_position + 1;
    end
    -- Add remainder of the string
    temp = temp || substring(input_value from search_start);
    return temp;
end

Я не сделал полностью протестируйте эту функцию, поэтому обязательно проверьте ее самостоятельно.

Пример использования:

select replace_tags('This is an {START example a=b}. The {duck} is big.')
from rdb$database

Вывод:

This is an (#example a=b#). The {duck} is big.
...