如何从 PostgreSQL 中的文本中删除分隔部分?

Oma*_*osa 2 regex sql postgresql replace string-function

我想从字符串中消除一些文本模式,我的字符串有一个管道分隔符,并且参数并不总是相互跟随。

这是我的字符串

TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3
Run Code Online (Sandbox Code Playgroud)

我想消除TType=SENDURL=min://j?_a=3&ver=1.1

因此我的最终结果应该是

Status=OK|day=3
Run Code Online (Sandbox Code Playgroud)

我尝试过的。不适 用于 postgresql

select REGEXP_REPLACE('TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3', 
'(TType=.*?(\||$))|(URL=.*?(\||$))', '')
Run Code Online (Sandbox Code Playgroud)

小智 5

回答:

SELECT 
REGEXP_REPLACE(
 REGEXP_REPLACE('TType=SEND|Status=OK|URL=min://j?_a=3&ver=1.1|day=3',
  '(TType|URL)=[^|]*\|?', '','g'),
'\|$', '');
Run Code Online (Sandbox Code Playgroud)

解释:

  1. .*?模式中的部分虽然不贪婪,但也会消耗冒号,因此不会按预期运行。这是通过[^|]*消耗任何非冒号字符零次或多次来解决的。

  2. 然后您还需要添加全局标志“g”,以替换所有出现的模式,如文档中所述。

  3. 最后,如果您需要消除的参数最后出现(因为参数可以按任何顺序出现),您需要添加额外的替换步骤以消除字符串末尾的残留冒号。

例如没有额外的步骤,以下

SELECT
REGEXP_REPLACE('Status=OK|URL=min://j?_a=3&ver=1.1|day=3|TType=SEND',
  '(TType|URL)=[^|]*\|?', '','g');
Run Code Online (Sandbox Code Playgroud)

产生

Status=OK|day=3|
Run Code Online (Sandbox Code Playgroud)

同时,添加额外的步骤,以下

SELECT 
REGEXP_REPLACE(
 REGEXP_REPLACE('Status=OK|URL=min://j?_a=3&ver=1.1|day=3|TType=SEND',
  '(TType|URL)=[^|]*\|?', '','g'),
'\|$', '');
Run Code Online (Sandbox Code Playgroud)

产生所需的

Status=OK|day=3
Run Code Online (Sandbox Code Playgroud)