在一个字符串中查找源 na 替换参数并在另一个字符串中执行替换

Posted

技术标签:

【中文标题】在一个字符串中查找源 na 替换参数并在另一个字符串中执行替换【英文标题】:Find source na replacement parameters in a string and perform replacement in another string 【发布时间】:2019-04-18 05:13:10 【问题描述】:

我需要一个应用特定规则的函数来替换字符串中的单词。

有两个变量:

v_imp_user_list - 用竖线分隔的用户列表(例如:JOHN|PETER|MARK|USER_PROD) v_schema_remap_list - 应重新映射的用户列表(旧值 - 新值,例如:JOHN-GEORGE,USER_PROD-USER_TEST)

该函数应该解析 v_schema_remap_list 变量以及第一个用户的名称(破折号之前,旧值) 存在于 v_imp_user_list 然后用第二个用户替换它(破折号后,新值)。

例子:

v_imp_user_list := 'JOHN|PETER|MARK|USER_PROD'

v_schema_remap_list := 'JOHN-GEORGE,USER_PROD-USER_TEST'

期望的结果: 乔治|彼得|马克|USER_TEST

我有一个解决方案,我会发布,但由于某种原因我不喜欢它,我会感谢任何评论/评论/更好的解决方案。

【问题讨论】:

【参考方案1】:

这个函数帮助我解析 v_schema_remap_list。

  --    extract nth occurence in a delimited string
        create or replace function f_find_str (
            source_string varchar2
            , occurence_outer number --occurence of the old-new pair
            , occurence_inner number --old/new value, enter 1 for old or 2 for new
            )
        return varchar2
        is
            v_aux varchar2(500);
            v_result varchar2(100);
        begin
            v_aux := ltrim(regexp_substr(',' || source_string, ',[^,]*', 1, occurence_outer),',');
            if occurence_inner = 1 then
                v_result := substr(v_aux, 1, instr(v_aux, '-')-1);
            elsif occurence_inner = 2 then
                v_result := substr(v_aux, instr(v_aux, '-')+1);
            end if;
            return v_result;
        end;
        /

这个匿名块显示了我的解决方案(见里面的循环)。

    declare
     v_schema_remap_list varchar2(1000) := 'JOHN-GEORGE,USER_PROD-USER_TEST';
     v_imp_user_list varchar2(1000) := 'JOHN|PETER|MARK|USER_PROD';
     v_schema_remap_cnt number := nvl(regexp_count(v_schema_remap_list, '-'), 0); 
    begin

        for i in 1..v_schema_remap_cnt
        loop
            v_imp_user_list := replace(
                v_imp_user_list||'|', 
                f_find_str (
                source_string => v_schema_remap_list
                , occurence_outer => i
                , occurence_inner => 1
                )||'|', 
                f_find_str (
                source_string => v_schema_remap_list
                , occurence_outer => i
                , occurence_inner => 2
                )||'|'
            );
            v_imp_user_list := rtrim(v_imp_user_list, '|');
        end loop;
        dbms_output.put_line(v_imp_user_list); --test output
    end;
    /

【讨论】:

以上是关于在一个字符串中查找源 na 替换参数并在另一个字符串中执行替换的主要内容,如果未能解决你的问题,请参考以下文章

需要使用正则表达式找到2个字符串,并在它们之间插入多行文本并插入替换文本

php中判断一个字符是否在字符串中

求解,用C语言编写一个程序,查找一个字符串在另一个字符串中出现的次数,谢谢大家了!

VIM-20200328

MySQL字符串的拼接截取替换查找位置

Powershell脚本调用表达式查看传递给调用脚本的字符串参数并在其中查找错误