我正在尝试为此查询创建一个正则表达式:
SELECT gruppo
FROM righe_conto_ready
WHERE regexp_replace(gruppo,'(\[{1})|(\].*?\[)|(\].*$)','','g') = '[U6][U53]'
LIMIT 10
这是'gruppo'专栏的一个例子:
[U6] CAFFETTERIA [U43] THE E TISANE
我目前正在使用此查询进行测试:
SELECT regexp_replace(gruppo,'(\[{1})|(\].*?\[)|(\].*$)','','g') FROM ....
,它只返回U6
如何更改正则表达式以删除括号外的所有内容?
答案 0 :(得分:1)
您可以将regexp_matches()
与更简单的正则表达式一起使用:
with righe_conto_ready(gruppo) as (
select '[U6] CAFFETTERIA [U43] THE E TISANE'::text
)
select gruppo
from righe_conto_ready,
lateral regexp_matches(gruppo, '\[.+?\]', 'g') matches
group by 1
having string_agg(matches[1], '') = '[U6][U43]'
gruppo
-----------------------------------------
[U6] CAFFETTERIA [U43] THE E TISANE
(1 row)
当您要查找某些模式的多个匹配项时,regexp_matches()
似乎比regexp_replace()
更自然。
您还可以在括号中搜索前两个子字符串(没有g
标志,函数产生的行不超过一行):
select gruppo
from righe_conto_ready,
lateral regexp_matches(gruppo, '(\[.+?\]).*(\[.+?\])') matches
where concat(matches[1], matches[2]) = '[U6][U43]'