【发布时间】:2013-04-30 16:53:16
【问题描述】:
我正在尝试从包含换行 (NL) 字符(可能还有其他 \n、\r、\t)的表中选择一列。我想使用 REGEXP 选择数据并用空格“”替换(仅这三个)字符。
【问题讨论】:
我正在尝试从包含换行 (NL) 字符(可能还有其他 \n、\r、\t)的表中选择一列。我想使用 REGEXP 选择数据并用空格“”替换(仅这三个)字符。
【问题讨论】:
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
【讨论】:
不需要正则表达式。这可以通过 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 代码。
【讨论】:
\x0A、\x0B 等转义字符的原则对我不起作用。甲骨文 11g。任何人都知道为什么?有没有针对这个的优化设置?
TRANSLATE 不能将多个换行符折叠成一个替换。我还希望它能够复制 Windows 行尾的新分隔符。正则表达式版本似乎对我不起作用。它没有取代任何东西。不过,这个正则表达式似乎可以工作:'(['||chr(10)||chr(11)||chr(13)||']+)'。 (如果您希望单独替换每个实例,请删除 +。)
regexp_replace(text, '\s+', ' ') 会这样做。
\x09|\x0A|\x0D。括号和方括号也不是必需的。正如给出的答案一样,它会导致贪婪扩展,并且其他字符也会被删除。