Postgres regexp替换不起作用

时间:2016-12-28 17:36:31

标签: regex postgresql regexp-replace

我正在尝试为此查询创建一个正则表达式:

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

如何更改正则表达式以删除括号外的所有内容?

1 个答案:

答案 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]'