替换下划线分隔的字符串中的第N组字符_

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

我想在

'_'
上拆分字符串,并将第三组替换为
'oooo'

有没有什么方法可以简单地做到这一点并且不假设正好有 5 个组?

CONCAT( SPLIT_PART(test, '_', 1)
       ,SPLIT_PART(test, '_', 2)
       ,'OOOO'
       ,SPLIT_PART(test, '_', 4)
       ,SPLIT_PART(test, '_', 5)
      )

示例:

'GjHf00_i8S7b_tst00_UL000_perce'

变成这样了
'GjHf00_i8S7b_oooo_UL000_perce'

sql regex postgresql
1个回答
0
投票

您可以使用

regexp_replace()

regexp_replace ( string text, pattern text, replacement text, start integer, N integer [, flags text ] ) → text

替换 POSIX 正则表达式模式第 N 个匹配的子字符串,或者如果 N 为零则替换所有此类匹配;请参阅第 9.7.3 节

db<>fiddle

演示
select regexp_replace(test,'[^_]+','oooo',1,3)
from examples;

它正在寻找 1 个或多个非下划线的子字符串,从位置 1 开始并尝试替换第三个匹配项:

  • []
    是一组允许的字符
  • 组内的
  • ^
    表示您希望排除该组
  • _
    只是下划线
  • +
    表示您正在寻找其中的 1 个或多个

如果您同意总是有 5 个小组的假设,那么只要您将

concat()
替换为
concat_ws()
,您的想法就会有效。否则你会丢失你要分割的下划线:

select concat_ws('_',split_part(test, '_', 1)
                    ,split_part(test, '_', 2)
                    ,'oooo'
                    ,split_part(test, '_', 4)
                    ,split_part(test, '_', 5) )
from examples;
© www.soinside.com 2019 - 2024. All rights reserved.