【问题标题】:Oracle regex_replace not working as expectedOracle regexp_replace 未按预期工作
【发布时间】:2020-08-06 16:45:50
【问题描述】:

我有以下 SQL 查询 (Oracle 18c):

SELECT 
    --FIRST
    translate(
        ' sOmE tEsT


                   eNdOfLiNe', 
        chr(10)||chr(11)||chr(13), 'replText'
    ) "Result1",

    --SECOND
    regexp_replace(
        ' sOmE tEsT


                   eNdOfLiNe',
        '[\x0A|\x0B|`\x0D]', 'replText'
    ) "Result2",

    --THIRD
    regexp_replace(
        ' sOmE tEsT


                   eNdOfLiNe',
        '[\r\n\t]', 'replText', 1, 0
    ) "Result3"
FROM dual

我想做的是用新字符串替换所有选项卡、回车符和换行符,但似乎正则表达式替换不起作用(返回初始文本)。对于格式化,我真的很抱歉,但我需要使用\r \n \t 混合字符处理上述格式的文本。

这里是小提琴:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=63834f9bcab93136635366f18c375b13

我现在正在学习 Oracle,但不明白为什么第二个和第三个解决方案会返回初始文本。第一个解决方案似乎有效,但我想在SECOND 和THIRD 解决方案中达到相同的效果。我错过了什么?

【问题讨论】:

  • 如果 REGEXP_REPLACE() 未能将正则表达式与输入字符串匹配,则返回输入字符串。请注意,这与 REGEXP_SUBSTR() 不同,如果未找到匹配项,则返回 NULL。

标签: oracle


【解决方案1】:

我很确定 Oracle 不允许在字符类中使用转义序列。我相信这是你必须做的。为了回应您对此处另一个答案的评论以及您正在学习的内容,正则表达式绝对不是正则表达式。尤其是 Oracle 的实现。

编辑解释正则表达式:正则表达式模式正在构建一个包含 3 个字符的正则表达式字符类的字符串,因此是连接。您不能只在正则表达式中使用转义字符,因为正则表达式会将这些字符作为字符类模式本身的一部分。

SELECT REGEXP_REPLACE(
' sOmE tEsT


                       eNdOfLiNe', '['||CHR(9)||CHR(10)||CHR(13)||']', 'X') Result3
FROM dual;

RESULT3                       
------------------------------
 sOmE tEsTXXXXXXXX   eNdOfLiNe
1 row selected.

【讨论】:

    【解决方案2】:

    您可以使用与翻译类似的格式尝试以下操作

      select  regexp_replace(
       ' sOmE tEsT
    
    
                   eNdOfLiNe',
        chr(10)||'|'||chr(11)||'|'||chr(13), 'replText') "Result3"
        FROM dual
    

    【讨论】:

    • 当然,但是如果 Oracle 文档页面上发布了一些正则表达式示例,为什么正则表达式不起作用?
    • 您能否提供提及换行正则表达式的 oracle 文档的链接
    • \r \n \t 没有明确的例子,但正则表达式是正则表达式,对吗? web f.e.中有一些例子。 chrismemo.wordpress.com/2018/05/18/…
    • @AdamMrozek 上面链接中提到的那个例子不起作用(至少在 11g 上),即使在修复错字之后(删除反引号)。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多