Próbuję wybrać kolumnę z tabeli zawierającej znaki nowej linii (NL) (i prawdopodobnie inne \n
, \r
, \t
). Chciałbym użyć REGEXP do wybrania danych i zastąpienia (tylko tymi trzema) znakami spacji "".Oracle Regexp, aby zastąpić n, r i t spacją
9
A
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.
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". –
Funkcja TRANSLATE() jest znacznie bardziej wydajna niż jej odpowiednik regex. Dlaczego więc chcesz użyć wyrażenia regularnego? – APC
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