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

Dav*_*vis 4 regex arrays 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;
Run Code Online (Sandbox Code Playgroud)

返回这些结果:

{i1}
{o2}
{g1}
{o17}
Run Code Online (Sandbox Code Playgroud)

而不是以下结果:

i1
o2
g1
o17
Run Code Online (Sandbox Code Playgroud)

相关链接

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

Erw*_*ter 6

最优解

您的regexp_matches()模式只能在每个模式评估中生成一个元素,因此所有生成的行仅限于一个数组元素.表达式简化为:

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

其他方案

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
Run Code Online (Sandbox Code Playgroud)

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

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

在Postgres的10或更高版本它也谨慎地建议设置恢复功能(SRF)regexp_matches()SELECT直接列表(像里克提供),因为在多个战略成果框架的行为SELECT名单终于被消毒: