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

时间:2018-03-16 14:46:12

标签: postgresql regexp-replace

我正在尝试编写一个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"

3 个答案:

答案 0 :(得分:1)

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

Try it out here

答案 1 :(得分:0)

您可以在任意数量的空格或逗号(,|\s)+上拆分字符串,并使用逗号将其重新连接在一起:

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

答案 2 :(得分:0)

我认为最好的选择是使用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