如何在 oracle 中使用 Regexp_Replace 替换字符串
How to replace string using Regexp_Replace in oracle
我想替换这个:
"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/KOL
但是 10/8/36
字符串应该是 10#8#36
这是一个使用 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+)#', '####') AS output
FROM yourTable;
此正则表达式替换是否特定 enough/accurate 取决于您从未向我们展示的数据。
这会将第 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,
'^(.*?/.*?)/(.*?)/(.*)$',
'##'
) 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<>fiddle here
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)/', '#') result_str_2
from s;
我想替换这个:
"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/KOL
但是 10/8/36
字符串应该是 10#8#36
这是一个使用 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+)#', '####') AS output
FROM yourTable;
此正则表达式替换是否特定 enough/accurate 取决于您从未向我们展示的数据。
这会将第 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,
'^(.*?/.*?)/(.*?)/(.*)$',
'##'
) 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<>fiddle here
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)/', '#') result_str_2
from s;