包含默认空数组的正则表达式替换
Regex Replace that contains default empty array
我正在尝试创建一个函数,它接受一个文本参数和一个文本参数数组,当没有传递第二个参数时,该数组默认为空数组。
然后我想替换文本参数中也出现在要删除的文本数组中的所有单词。如果这个数组是空的,我不想删除任何东西。
到目前为止,我有这个:
create or replace function remove_words(name text, words_to_remove text[] default '{}'::text[]) returns text as
$$
select regexp_replace(name,(select '(' || string_agg(r,'|') || ')' from unnest(words_to_remove) r),'','gi');
$$ language sql immutable parallel safe;
目前,如果我用两个参数调用该函数,它似乎按预期运行:
select remove_words('red orange blue green', '{black, brown, green, orange}');
remove_words
---------------
red blue
但是,如果我不传递第二个参数,则返回的文本为空白,而不是原始值:
select remove_words('red orange blue green');
remove_words
---------------
任何人都可以建议我如何才能完成这项工作吗?
我会采取相反的做法,即:将字符串变成table个单词,然后剔除属于数组的单词。
create or replace function remove_words(
name text,
words_to_remove text[] default '{}'::text[]
) returns text as
$$
select string_agg(word, ' ')
from unnest(string_to_array(name, ' ')) n(word)
where not n.word = any (words_to_remove)
$$ language sql immutable parallel safe;
也可以使用regexp_split_to_table()
分割字符串:
create or replace function remove_words2(
name text,
words_to_remove text[] default '{}'::text[]
) returns text as
$$
select string_agg(word, ' ')
from regexp_split_to_table(name, ' ') n(word)
where not n.word = any (words_to_remove)
$$ language sql immutable parallel safe;
这可以正确处理输入数组为空的情况。
select remove_words('red orange blue green', '{black, brown, green, orange}');
| remove_words |
| ------------ |
| red blue |
select remove_words('red orange blue green');
| remove_words |
| --------------------- |
| red orange blue green |
select remove_words2('red orange blue green', '{black, brown, green, orange}');
| remove_words2 |
| ------------- |
| red blue |
select remove_words2('red orange blue green');
| remove_words2 |
| --------------------- |
| red orange blue green |
我正在尝试创建一个函数,它接受一个文本参数和一个文本参数数组,当没有传递第二个参数时,该数组默认为空数组。
然后我想替换文本参数中也出现在要删除的文本数组中的所有单词。如果这个数组是空的,我不想删除任何东西。
到目前为止,我有这个:
create or replace function remove_words(name text, words_to_remove text[] default '{}'::text[]) returns text as
$$
select regexp_replace(name,(select '(' || string_agg(r,'|') || ')' from unnest(words_to_remove) r),'','gi');
$$ language sql immutable parallel safe;
目前,如果我用两个参数调用该函数,它似乎按预期运行:
select remove_words('red orange blue green', '{black, brown, green, orange}');
remove_words
---------------
red blue
但是,如果我不传递第二个参数,则返回的文本为空白,而不是原始值:
select remove_words('red orange blue green');
remove_words
---------------
任何人都可以建议我如何才能完成这项工作吗?
我会采取相反的做法,即:将字符串变成table个单词,然后剔除属于数组的单词。
create or replace function remove_words(
name text,
words_to_remove text[] default '{}'::text[]
) returns text as
$$
select string_agg(word, ' ')
from unnest(string_to_array(name, ' ')) n(word)
where not n.word = any (words_to_remove)
$$ language sql immutable parallel safe;
也可以使用regexp_split_to_table()
分割字符串:
create or replace function remove_words2(
name text,
words_to_remove text[] default '{}'::text[]
) returns text as
$$
select string_agg(word, ' ')
from regexp_split_to_table(name, ' ') n(word)
where not n.word = any (words_to_remove)
$$ language sql immutable parallel safe;
这可以正确处理输入数组为空的情况。
select remove_words('red orange blue green', '{black, brown, green, orange}');
| remove_words |
| ------------ |
| red blue |
select remove_words('red orange blue green');
| remove_words |
| --------------------- |
| red orange blue green |
select remove_words2('red orange blue green', '{black, brown, green, orange}');
| remove_words2 |
| ------------- |
| red blue |
select remove_words2('red orange blue green');
| remove_words2 |
| --------------------- |
| red orange blue green |