Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要使用regexp_replace(Postgresql)在数字列表中添加逗号_Postgresql_Regexp Replace - Fatal编程技术网

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

需要使用regexp_replace(Postgresql)在数字列表中添加逗号,postgresql,regexp-replace,Postgresql,Regexp Replace,我正在尝试编写一个postgres函数,该函数将数字列表清理成逗号分隔的数字列表。这些数字正在输入到一个输入字段中。我想让用户只需输入一行空格分隔的数字(例如:1 3 4 12),并将其更改为1,3,4,12 但是,如果他们输入正确(例如:1,3,4,12或1,3,4,12),我仍然希望它将其消毒为1,3,4,12。我还必须考虑一些事情,比如(例如:1、3、4、12) 这就是我目前正在做的: select regexp_replace(trim(list_of_numbers), '[^0-9.

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

但是,如果他们输入正确(例如:
1,3,4,12
1,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”

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

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

我认为最好的选择是使用
regexp\u split\u to\u 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       

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


问题是,你会得到多余的逗号,例如,1,2,3,4->1,2,3,4,如果它们像“1,2,3,14”那样输入,那么这些都可以使用,但是如果它们实际上像“1,2,3,14”那样输入逗号,那么它会添加额外的逗号(“1,2,4,14”)。添加逗号作为拆分正则表达式的一部分,现在应该可以使用了。你的正则表达式会多次匹配多个空格,例如。“1||4”变为“1,,,4”。我认为
(,|\s)+
对于任何空格组合都更合适,除非用户输入额外的空格(例如:“1,2,4 12”)。然后得到“1,2,4,,,12”。