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



>Friends,

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

Original: '/u02/DB/FILE/file01.dbf' or 
Original: '+DATA/DB/FILE/file01.dbf'
Required : '/u01/data/dbname/file01.dbf'
    从原始字符的第 2
  1. 个字符开始搜索,找到"/"的第 1 个和第 2 个出现并替换为数据(希望这涵盖了两个原始场景(
  2. 从原始字符的第 2 个字符开始搜索,找到第 2 个和第 3 个出现的"/"并替换为 dbname

原始的DB和FILE可以是任何位置,因此无法真正对其进行硬编码。

我在下面使用以下命令将 FILE 替换为 dbname,但这并没有完全帮助,

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

    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;

谢谢,非常感谢。

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

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

替换为 1data/dbname

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

快速在线测试:

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

最新更新