使用postgres中的正则表达式从字符串中检索和组合信息块

时间:2016-10-04 15:45:02

标签: sql regex postgresql

我需要从具有以下格式的结构化文本片段中检索信息:

(AAB) Some name1 here 1234 (BB) More 12-text 99 (XY*) Hello world 12

我想要了解的内容如下:{AAB1234, BB99, XY*12}

策略

  1. 在括号内输入字符[例如(XY*)]
  2. 获取最后一组数字,后跟括号或字符串结尾[例如1234(]
  3. 我没有走得太远,因为我的正则表达能力非常有限。

    SELECT regexp_matches('(AAB) Some name1 1234 (BB) More text 99 (XY*) Hello world 12',
              '\((.*?)\).*?(\d+)', 'g');
    

    给予

    {AAB,1}
    {BB,9}
    {XY*,1}
    

    有什么想法吗?

    加载项问题

    我在表information的{​​{1}}列中有上述文字信息,我想将结果写入列my_table。如何将上述解决方案集成到results语句中? 即。

    UPDATE

1 个答案:

答案 0 :(得分:2)

您可以尝试:

SELECT array_agg(v) FROM (
    SELECT array_to_string(
               regexp_matches(
                   '(AAB) Some name1 1234 (BB) More text 99 (XY*) Hello world 12',
                   '\((.*?)\).*?(\d+)(?=$| \()', 'g'
               ),
               ''
           ) as v
    ) s;

请注意,正常情况下,如果您没有非常正式的语法定义,则regexp可能会非常脆弱。

修改

要更新,这应该可以解决问题:

UPDATE my_table SET results = ARRAY(
    SELECT array_to_string(
               regexp_matches(
                   information,
                   '\((.*?)\).*?(\d+)(?=$| \()', 'g'
               ),
               ''
           )
    );

它希望结果为text[]类型。或者,您可以通过添加array_to_string将结果存储为字符串。