2013-05-06 11 views

Odpowiedz

20

Nie ma potrzeby stosowania wyrażeń regularnych. Można to łatwo zrobić z kodami ASCII i nudny starych TRANSLATE()

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

Zastępuje przełamane, zakładki i powrót karetki z miejsca.


Funkcja TRANSLATE() jest znacznie wydajniejsza niż jej odpowiednik w wyrażeniu regularnym. Jeśli jednak twoje serce jest nastawione na takie podejście, powinieneś wiedzieć, że możemy odwoływać się do kodów ASCII w regex. Tak więc to stwierdzenie jest wersją wyrażeń regularnych powyższego.

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

Tweak jest odniesienie do kodu ASCII w systemie szesnastkowym zamiast podstawy 10.

+0

dzięki. Ale nie chcę używać funkcji tłumaczenia zamiast używać tylko REGEXP. Jeden sposób, w jaki mogłem to zrobić, był następujący: wybierz regexp_replace ("Hello" || chr (10) || 'XYZ', '[[: cntrl:]]', '') od dual; Teraz "[[: cntrl:]]" zastąpi wszystkie niedrukowalne znaki, ale chciałem wiedzieć, jak określić tylko "\ n", "\ r" i "\ t". –

+2

Funkcja TRANSLATE() jest znacznie bardziej wydajna niż jej odpowiednik regex. Dlaczego więc chcesz użyć wyrażenia regularnego? – APC

+2

Ta zasada unikania znaków przy użyciu '\ x0A',' \ x0B' itp. Nie działa dla mnie. Oracle 11g. Ktoś wie z jakichś powodów? Czy istnieje ustawienie optymalizacji? – cartbeforehorse