如何在pgsql regexp_replace中进行积极的工作?

时间:2019-03-27 09:54:32

标签: regex postgresql-9.6

我做过的最简单的测试就是这个:

SELECT regexp_replace((09,09,41,41,42,42,49,49,49,49,200,200,400,400,500,500), '(?<=,|^)([^,]*)(,\\1)+(?=,|$)', '\\1') AS lignes

我想让regex101显示给我:09,41,42,49,200,400,500。 但是整个字符串来了。 有帮助吗?

1 个答案:

答案 0 :(得分:1)

首先,除非打开standard_conforming_strings,否则无需将反斜杠加倍:

  

standard_conforming_strings (boolean)

   这可以控制普通字符串文字('...')是否按SQL标准指定的方式按字面对待反斜杠。从PostgreSQL 9.1开始,默认设置为on(以前的版本默认为off)。应用程序可以检查此参数以确定如何处理字符串文字。此参数的存在也可以用作表明支持转义字符串语法(E'...')。如果应用程序希望将反斜杠视为转义字符,则应使用转义字符串语法(Section 4.1.2.2)。

接下来,您需要使用g全局修饰符替换所有匹配项,请参见9.7. Pattern Matching section

  

标记i指定不区分大小写的匹配,而标志g指定替换每个匹配的子字符串,而不是仅替换第一个。

使用

SELECT regexp_replace('09,09,41,41,42,42,49,49,49,49,200,200,400,400,500,500', '(?<=,|^)([^,]*)(,\1)+(?=,|$)', '\1', 'g') AS lignes

enter image description here

请参见online demo

如果您想使模式更有效,请使用双重否定:

'(?<![^,])([^,]*)(,\1)+(?![^,])'
相关问题