在一个字符串中查找源 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个字符串,并在它们之间插入多行文本并插入替换文本