2013-05-06 2 views
9

Я пытаюсь выбрать столбец из таблицы, содержащей символы новой строки (NL) (и, возможно, другие \n, \r, \t). Я хотел бы использовать REGEXP для выбора данных и замены (только этих трех) символов пробелом «".Oracle Regexp для замены n, r и t с пробелом

ответ

20

Нет необходимости в регулярном выражении. Это можно легко сделать с 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; 

твик ссылаться на код ASCII в шестнадцатеричном формате, а не основанием 10.

+0

Спасибо. Но я не хочу использовать функцию перевода, вместо этого хочу использовать только REGEXP. Один из способов, которым я мог это сделать, был следующим: select regexp_replace ('Hello' || chr (10) || 'XYZ', '[[: cntrl:]]', '') от dual; Теперь «[[: cntrl:]]» заменит все непечатаемые символы, но я хотел знать, как указывать только «\ n», «\ r» и «\ t». –

+2

TRANSLATE() намного эффективнее, чем эквивалент регулярного выражения. Итак, почему вы хотите использовать регулярное выражение? – APC

+2

Этот принцип экранирования символов с использованием '\ x0A',' \ x0B' и т. Д. Не работает для меня. Oracle 11g. Кто-нибудь знает, почему? Есть ли настройка оптимизации для этого? – cartbeforehorse

Смежные вопросы