【问题标题】:Oracle Regexp to replace \n,\r and \t with spaceOracle Regexp 用空格替换 \n、\r 和 \t
【发布时间】:2013-04-30 16:53:16
【问题描述】:

我正在尝试从包含换行 (NL) 字符(可能还有其他 \n\r\t)的表中选择一列。我想使用 REGEXP 选择数据并用空格“”替换(仅这三个)字符。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    select translate(your_column, chr(10)||chr(11)||chr(13), ' ') from your_table;

    要清理,必须将非空值作为参数提供... (oracle函数基本上会在1个参数为null时返回null,很少有像replace-functions这样的excpetions)

    select translate(your_column, ' '||chr(10)||chr(11)||chr(13), ' ') from your_table;

    此示例使用 ''->'' 翻译作为 dummy-value 以防止参数 3 中出现 Null-Value

    【讨论】:

      【解决方案2】:

      不需要正则表达式。这可以通过 ASCII 码和无聊的旧 TRANSLATE() 轻松完成

      select translate(your_column, chr(10)||chr(11)||chr(13), '    ')
      from your_table;
      

      这用空格替换换行符、制表符和回车符。


      TRANSLATE() 比它的正则表达式更有效。但是,如果您决定采用这种方法,您应该知道我们可以在正则表达式中引用 ASCII 代码。所以这个语句是上面的正则表达式版本。

      select regexp_replace(your_column,  '([\x0A|\x0B|`\x0D])', ' ')
      from your_table;
      

      调整是引用十六进制而不是基数 10 的 ASCII 代码。

      【讨论】:

      • TRANSLATE() 比它的正则表达式更有效。那么为什么要使用正则表达式呢?
      • 这种使用\x0A\x0B 等转义字符的原则对我不起作用。甲骨文 11g。任何人都知道为什么?有没有针对这个的优化设置?
      • @APC TRANSLATE 不能将多个换行符折叠成一个替换。我还希望它能够复制 Windows 行尾的新分隔符。正则表达式版本似乎对我不起作用。它没有取代任何东西。不过,这个正则表达式似乎可以工作:'(['||chr(10)||chr(11)||chr(13)||']+)'。 (如果您希望单独替换每个实例,请删除 +。)
      • 如果可以替换 all 空格(例如包括制表符),regexp_replace(text, '\s+', ' ') 会这样做。
      • 对于 regexp_replace,这个答案在两个方面是错误的。 \t 是 chr(9),\n 是 chr(10),\r 是 chr(13),导致正则表达式应为 \x09|\x0A|\x0D。括号和方括号也不是必需的。正如给出的答案一样,它会导致贪婪扩展,并且其他字符也会被删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2016-04-11
      • 2011-03-04
      相关资源
      最近更新 更多