我做过的最简单的测试就是这个:
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。 但是整个字符串来了。 有帮助吗?
答案 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
请参见online demo。
如果您想使模式更有效,请使用双重否定:
'(?<![^,])([^,]*)(,\1)+(?![^,])'