鉴于以下标题Olympic National Park, WA. [OC][5239x3492]
,目标是捕获标记OC
,5239x3492
,并捕获5239
和3492
作为两个单独的捕获。我们的想法是使用一系列积极的预测(?=)
来非消费地进行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)
答案 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