如何在oracle中使用Regexp_Replace替换字符串

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

我想替换这个:

"STORES/KOL#10/8/36#1718.00#4165570.00#119539388#PT3624496#9902001#04266#6721#PT3624496-11608091-1-55-STORES/KOL"

有了这个:

"STORES/KOL#10#8#36#1718.00#4165570.00#119539388#PT3624496#9902001#04266#6721#PT3624496-11608091-1-55-STORES/KOL"

基本上这是有条件的替换我想用/替换#STORES/KOL字符串应该是STORES/KOL10/8/36字符串应该是10#8#36

oracle oracle11g oracle10g
3个回答
0
投票

这将用/替换第2和第3个#角色:

Oracle安装程序:

CREATE TABLE test_data ( value ) AS
SELECT '"STORES/KOL#10/8/36#1718.00#4165570.00#119539388#PT3624496#9902001#04266#6721#PT3624496-11608091-1-55-STORES/KOL"'
FROM   DUAL;

查询:

SELECT REGEXP_REPLACE(
         value,
         '^(.*?/.*?)/(.*?)/(.*)$',
         '\1#\2#\3'
       ) AS replacement
FROM   test_data

输出:

| REPLACEMENT                                                                                                       |
| :---------------------------------------------------------------------------------------------------------------- |
| "STORES/KOL#10#8#36#1718.00#4165570.00#119539388#PT3624496#9902001#04266#6721#PT3624496-11608091-1-55-STORES/KOL" |

db <>小提琴here


0
投票

这是使用REGEXP_REPLACE的一个选项。我们可以尝试定位以下正则表达式模式:

#(\d+)/(\d+)/(\d+)#

然后使用三个捕获组替换,用井号替换路径分隔符。

WITH yourTable AS (
    SELECT 'STORES/KOL#10/8/36#1718.00#4165570.00#119539388#PT3624496#9902001#04266#6721#PT3624496-11608091-1-55-STORES/KOL' AS input FROM dual
)

SELECT
    input,
    REGEXP_REPLACE(input, '#(\d+)/(\d+)/(\d+)#', '#\1#\2#\3#') AS output
FROM yourTable;

Demo

此正则表达式替换是否足够/准确用于其余数据取决于您从未向我们展示过的数据。


0
投票
with s as (select '"STORES/KOL#10/8/36#1718.00#4165570.00#119539388#PT3624496#9902001#04266#6721#PT3624496-11608091-1-55-STORES/KOL"' str from dual)
select 
replace(replace(str, '/', '#'), 'STORES#KOL', 'STORES/KOL') result_str_1,
regexp_replace(str, '(\d)/', '\1#')                         result_str_2
from s;
© www.soinside.com 2019 - 2024. All rights reserved.