从正则表达式结果中删除大括号

时间:2012-05-15 02:17:32

标签: arrays regex postgresql plpgsql set-returning-functions

问题

此代码:

select
  x::text
from
  regexp_matches( 'i1 into o2, and g1 into o17', '[gio][0-9]{1,}', 'g' ) as x;

返回以下结果:

{i1}
{o2}
{g1}
{o17}

而不是以下结果:

i1
o2
g1
o17

相关链接

问题

使用PostgreSQL 9.x删除大括号的最有效方法是什么?

1 个答案:

答案 0 :(得分:6)

最佳解决方案

您的regexp_matches()模式每个模式评估只能生成一个元素,因此所有生成的行都被约束为一个数组元素。表达式简化为:

SELECT x[1]
FROM   regexp_matches('i1 into o2, and g1 into o17', '[gio][0-9]{1,}', 'g') AS x;

其他解决方案

SELECT unnest(x)  -- also works for cases with multiple elements per result row

SELECT trim(x::text, '{}') -- corner cases with results containing `{}`

SELECT rtrim(ltrim(x::text, '{'), '}') AS x1 -- fewer corner cases

如果模式每个输入值可以匹配或不匹配多次,也请删除可选参数'g'

如果函数总是只返回一行,请考虑Postgres 10引入的略有不同的变体regexp_match()

在Postgres 10或更高版本中,谨慎地建议SELECT列表中的集合返回函数(SRF)regexp_matches()直接(如Rick provided),因为多个SRF的行为在SELECT列表终于被消毒了:

相关问题