postgresql:如何连接两个regexp_matches()

时间:2013-10-28 14:44:31

标签: regex postgresql

我试图从123A America,234B Britania这样的名字中提取整数和字符。 我只想要号码和附件(即123A)。 我正在使用regexp_matches(name,'(\ d +)(\ D)'),结果如下:

{123,A}, {456,B}

我认为使用连接,获取数组的第一个元素,使用两个不同的函数获取第二个元素 (regexp_matches(name, '(\d+)(\D)' )) [1] || (regexp_matches(name, '(\d+)(\D)' )) [2]

但它会产生错误: ERROR: functions and operators can take at most one set argument

如何将两个元素作为一个字符串?

2 个答案:

答案 0 :(得分:1)

您不必将要搜索的两个项目作为不同的集合,只需将它们作为一个集合。移除)(\d+之间的\D,这将返回一个包含您正在寻找的整个字符串的集合。

结果如下 - regexp_matches('123A America, 234B Britania', '(\d+\D)' )

这只会找到第一场比赛。要获取所有匹配的子字符串,请使用g标记 - regexp_matches('123A America, 234B Britania', '(\d+\D)', 'g')

答案 1 :(得分:0)

@Scott S得到了很好的答案但是如果你无法在一个捕获组中实现所需,那么解决方案是编写一个函数,将正则表达式结果赋值给变量然后使用它。

CREATE OR REPLACE FUNCTION do_something(_input character varying)
  RETURNS character varying AS
$BODY$
DECLARE
    matches text[];
BEGIN
    matches := regexp_matches(_input, '^([0-9]{1,}_[^_]{1,})_[a-z]{1,}(.*)$','i');
    return substring(matches[1], 0, 24)||matches[2];
END
$BODY$
  LANGUAGE plpgsql;