查找模式并替换(regexp_replace或substr)之间的字符串

时间:2017-05-26 20:24:12

标签: regex oracle dynamic substr

朋友,

我正在尝试生成动态sql脚本并从原始查询结果中替换字符串。

Original: '/u02/DB/FILE/file01.dbf' or 
Original: '+DATA/DB/FILE/file01.dbf'

Required : '/u01/data/dbname/file01.dbf'
  1. 从原始的第二个字符开始搜索,找到'/'的第一和第二个外观并替换为数据(希望这涵盖两个原始方案)
  2. 从原始的第二个字符开始搜索,找到'/'的第二和第三个外观,并用dbname
  3. 替换 原文中的DB和FILE可以是任何位置,因此无法真正硬编码。

    我使用下面用dbname替换FILE,但这并没有完全帮助,

    不知何故,感觉方法过于复杂,应该有更好/不同的方式。

        SELECT 'alter database rename file ''' || f.file_name || ''' to '''|| '/u01' ||
              REGEXP_REPLACE(SUBSTR(f.file_name, INSTR(f.file_name, '/',2)), '/FILE/', '/dbname/', 1||''';' stmt
        FROM ( SELECT name file_name, bytes
                 FROM v$tempfile
                 ORDER BY bytes ESC
             )f;
    

    谢谢,非常感谢。

1 个答案:

答案 0 :(得分:3)

您可以使用单个正则表达式替换操作:

^([^/]*/[^/]*/)[^/]*/[^/]*

替换为\1data/dbname

<强>详情

  • ^ - 匹配字符串的开头
  • ([^/]*/[^/]*/) - 第1组(从替换模式引用\1反向引用):
    • [^/]* - 除/
    • 以外的0个字符
    • / - 斜线
    • [^/]* - 除/
    • 以外的0个字符
    • / - 斜线
  • [^/]* - 除/
  • 以外的0个字符
  • / - 斜线
  • [^/]* - 除/
  • 以外的0个字符

A quick online test

select regexp_replace('/u02/DB/FILE/file01.dbf', '^([^/]*/[^/]*/)[^/]*/[^/]*', '\1data/dbname') AS RESULT from dual