使用不同的正则表达式模式使用regexp_matches()对同一文本进行多次捕获

时间:2017-06-06 07:53:36

标签: sql regex postgresql regex-lookarounds

鉴于以下标题Olympic National Park, WA. [OC][5239x3492],目标是捕获标记OC5239x3492,并捕获52393492作为两个单独的捕获。我们的想法是使用一系列积极的预测(?=)来非消费地进行N匹配,例如[\[\(\{](?=[a-zA-Z0-9\-_ \/]+)(?=[0-9]+)[\}\)\]],但这只会导致一堆空字符串(和混乱)。似乎对regexp_matches或积极展望的工作有误解,非常感谢。

说明:

SELECT (
  regexp_matches(
    'Olympic National Park, WA. [OC][5239x3492]', 
    '[\[\(\{]([a-zA-Z0-9\-_ \/]+)[\}\)\]]', 
    'gi'
  )
);

当前输出:

 regexp_matches 
----------------
 {OC}
 {5239x3492}
(2 rows)

期望的输出:

 regexp_matches 
----------------
 {OC}
 {5239x3492}
 {5239}
 {3492}
(4 rows)

1 个答案:

答案 0 :(得分:1)

匹配在任何正则表达式实现中都不能重叠。然而,你可以做的是将5239x3492之后的匹配分开:

select     u
from       t
cross join regexp_matches(col, '[\[\(\{]([a-z0-9 \/_-]+)[\}\)\]]', 'gi') m
left join  regexp_matches(m[1], '(\d+)x(\d+)', 'gi') s on true
cross join unnest(m || s) u

http://rextester.com/VKDTON30263