gpt4 book ai didi

regex - 如何在 Oracle 中转义 regexp_replace?

转载 作者:行者123 更新时间:2023-12-01 15:51:17 26 4
gpt4 key购买 nike

我正在为字符串创建一个小的replaceParam函数,并且希望能够转义替换,例如。克。

select regexp_replace('%ABC# %ABC#','%ABC#', 'XXX')
from dual;

导致

XXX XXX

但是我希望能够逃脱替换,例如。 G。在字符串前面加上\,否则该字符串将被替换。

select regexp_replace('%ABC# \%ABC#','<themagicregexp>', 'XXX')
from dual;

应该导致

XXX \%ABC#

我尝试了不匹配的字符列表,但这不起作用。

select regexp_replace('%ABC#abc\%ABC#','<themagicregexp>', 'XXX')
from dual;

应该导致

XXXabc\%ABC#

此外,因为有人提到了这一点:我不能使用单词边界,因为这也应该有效:

yoyo%ABC#yoyo

我感觉这可以在一个正则表达式中完成,但我只是没有看到它?

最佳答案

如果您没有类似 %ABC#%ABC# 的输入,这应该可以工作

SELECT REGEXP_REPLACE( '%ABC#abc\%ABC#', '((^|[^\])(\\\\)*)%ABC#', '\1XXX' )
FROM DUAL;

这将匹配:

  • 字符串 ^ 或非斜杠字符 [^\] 的开头,后跟任意数量的斜杠字符对,最后是字符 %ABC#。这将匹配 %ABC#\\%ABC#\\\\%ABC# 等,但不会匹配 \%ABC#, \\\%ABC#, \\\\\%ABC# 其中有一个斜杠转义了 % 字符。

替换包括第一个捕获组,因为表达式可以匹配前面的非斜杠字符和斜杠对,并且这些需要保留在输出中。


更新

这有点复杂,但它会重复匹配:

WITH Data ( VALUE ) AS (
SELECT '%ABC#%ABC#' FROM DUAL
)
SELECT ( SELECT LISTAGG(
REGEXP_REPLACE( COLUMN_VALUE, '((^|[^\])(\\\\)*)%ABC#$', '\1XXX' ),
NULL
) WITHIN GROUP ( ORDER BY NULL )
FROM TABLE(
CAST(
MULTISET(
SELECT REGEXP_SUBSTR( d.value, '.*?(%ABC#|$)', 1, LEVEL )
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( d.value, '.*?(%ABC#|$)' )
AS SYS.ODCIVARCHAR2LIST
)
)
) AS Value
FROM Data d;

它使用相关子查询将字符串拆分为以 %ABC# 或字符串结尾结尾的子字符串(这是 TABLE( 中的位) CAST( MULTISET( ) .. ) )),然后在每个子字符串的末尾执行替换后重新连接这些子字符串。

关于regex - 如何在 Oracle 中转义 regexp_replace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com