【问题标题】:Remove braces from regular expression result从正则表达式结果中删除大括号
【发布时间】:2012-05-22 12:45:48
【问题描述】:

问题

这段代码:

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 删除大括号的最有效方法是什么?

【问题讨论】:

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


    【解决方案1】:

    最优解

    您的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),因为 SELECT 列表中的多个 SRF 的行为终于有了已消毒:

    【讨论】:

    • Select ... regexp_matches(....)[1] from 对我不起作用。但是 unnest 做到了。 (单个模式匹配多次,生成多行。)谢谢。
    • @aberglas:OP 的情况(不捕获模式中的括号)在每个结果数组中只允许 一个 元素。最快的解决方案是第一个。如果结果中可以包含更多元素,则需要unnest()。我会说得更清楚。
    • 如果您的查询格式为select regexp_matches(column_name, regular_expression) from table_name,那么unnest() 是最简单的方法:select unnest(regexp_matches(column_name, regular_expression)) from table_name
    • @RickGladwin:是的 - 有保留。查看这个旧答案的更新。
    猜你喜欢
    • 2018-08-25
    • 2015-06-27
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多