我做过的最简单的测试就是这个:
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。但整个字符串来了。有帮助吗?
首先,除非打开standard_conforming_strings
,否则不需要加倍反斜杠:
standard_conforming_strings (boolean)
这控制普通的字符串文字('...')是否按字面意思处理反斜杠,如SQL标准中所规定的那样。从PostgreSQL 9.1开始,默认打开(先前版本默认为关闭)。应用程序可以检查此参数以确定如何处理字符串文字。此参数的存在也可以作为支持转义字符串语法(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
如果要使模式更有效,请使用双重否定:
'(?<![^,])([^,]*)(,\1)+(?![^,])'