需要使用 regexp_replace (Postgresql) 将逗号添加到数字列表中

Posted

技术标签:

【中文标题】需要使用 regexp_replace (Postgresql) 将逗号添加到数字列表中【英文标题】:Need to add commas to a list of numbers with regexp_replace (Postgresql) 【发布时间】:2018-08-25 16:24:59 【问题描述】:

我正在尝试编写一个 postgres 函数,它将数字列表清理为逗号分隔的数字列表。这些数字正在输入到输入字段中。我想让用户只输入一行以空格分隔的数字(例如:1 3 4 12)并将其更改为1,3,4,12

但是,如果他们确实输入正确(例如:1,3,4,121, 3, 4, 12),我仍然希望它对 1,3,4,12 进行消毒。我还必须考虑诸如(例如:1, 3 4, 12)之类的事情。

这是我目前正在做的:

select regexp_replace(trim(list_of_numbers), '[^0-9.] | [^,]', ',', 'g')

如果我有这样的列表:

select regexp_replace(trim('1, 2, 4, 14'), '[^0-9.] | [^,]', ',', 'g')

它返回:“1,2,4,14”,这很好。

但是,如果我有这样的列表:

select regexp_replace(trim('1 2 4 14'), '[^0-9.] | [^,]', ',', 'g')

它返回:"1,,,4"

【问题讨论】:

【参考方案1】:

如果您将正则表达式更改为[^0-9.]+,它将用, 替换所有非数字(即,,)。

Try it out here

【讨论】:

【参考方案2】:

我认为最好的选择是使用regexp_split_to_array 转换为数组,然后将其转回字符串:

以下内容:

with t(input) as (
  values 
    ('1 3 4 12'), 
    ('1,3,4,12'),
    ('1, 3 4, 12'),
    ('1,3,4,12'),
    ('1   3  4 , 12'),
    ('   1,  2  , 4 12   ')
)
select array_to_string(regexp_split_to_array(trim(input),'(\s+)|(\s*,\s*)'), ',')
from t;

返回:

array_to_string
---------------
1,3,4,12       
1,3,4,12       
1,3,4,12       
1,3,4,12       
1,3,4,12       
1,3,4,12       

【讨论】:

您的正则表达式会多次匹配多个空格,例如“1____4”变成“1,,,4”。我认为(,|\s)+ 的任何空白组合都更合适 此方法有效,除非用户输入额外的空格(例如:'1, 2, 4 12')。然后你得到“1,2,4,,,,12”。【参考方案3】:

您可以将字符串拆分为任意数量的空格或逗号(,|\s)+,然后使用逗号将其重新组合在一起:

select array_to_string(regexp_split_to_array('1 2 4 14', '(,|\s)+'), ', ');

【讨论】:

这个问题是你会得到多余的逗号,例如1, 2 3 4 -> 1,,2,3,4 如果他们输入类似 '1 2 3 14' 就可以了,但如果他们实际上输入了逗号,例如 '1, 2, 3, 14',它会添加额外的逗号 (""1 ,, 2,, 4,, 14"")。 添加逗号作为拆分正则表达式的一部分,现在应该可以使用

以上是关于需要使用 regexp_replace (Postgresql) 将逗号添加到数字列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中使用 REGEXP_REPLACE 删除单词

REGEXP_REPLACE 捕获组

如何在 Hive 中使用 regexp_replace() 一次删除多个字符?

如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?

在 Hive 中,如何使用“regexp_replace()”对标记值执行通配符搜索,以将其替换为公共值?

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]