如何在pgsql regexp_replace中看待正面工作?

问题描述 投票:1回答:1

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

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。但整个字符串来了。有帮助吗?

regex postgresql-9.6
1个回答
1
投票

首先,除非打开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

enter image description here

online demo

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

'(?<![^,])([^,]*)(,\1)+(?![^,])'
© www.soinside.com 2019 - 2024. All rights reserved.