2015-06-21 1 views
4

Есть ли какая-либо функция, которая может заменить все символы, кроме ascii 32 до 127 и ascii 0, 13, 27 в postgres sql. Я не хочу заменять пробелы, линейные каналы и т. Д. Я хочу заменить странные символы, такие как знаки клуба, квадратные или странные звездочки.Заменить все символы, кроме ascii 32 до 127 и ascii 0, 13, 27 в postgres sql

Я попытался изменить regexp_replace, как показано ниже, но он не работает.

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^\x00-\x7f]', '', 'g') 
--This is giving error ERROR: 22021: invalid byte sequence for encoding "UTF8": 0x00 

select *, regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^[:ascii:]]', '', 'g') 
--This one is taking everything beyond 255 also in the set. 

Спасибо большое за ваше время и помочь

ответ

2

Try диапазон Юникода:

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[\u0080-\u00ff]', '', 'g') 

Reference

Это удалит любой символ в диапазоне 128-255 ASCII.

+0

Я считаю, что специальные символы превышают 255. Мы можем изменить это. Это не сработало. – Neena

+0

'[^ \ u0001- \ u007f]' – zerkms

+0

Это тоже не сработало. Не заменил персонажа, который выглядит как квадрат и звездочка с широкими плечами. – Neena

1

Вы были почти прямо с:

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^\x00-\x7f]', '', 'g') 

но нулевые байты \x00 не являются действительными в PostgreSQL строковых литералов, так что вы должны были бы начать в \x01. Ваш желаемый диапазон начинается с 32 (0x20), поэтому использовать что плюс несколько конкретных включения на 13 (0x0d) и 27 (0x1B):

select regexp_replace('abc$wanto&tore9046move#special~04 chars', '[^\x20-\x7f\x0d\x1b]', '', 'g') 

или, с более полезным вводом:

regress=> select regexp_replace('aáiï*∞ıb ', '[^\x20-\x7f\x0d\x1b]', '', 'g'); 
regexp_replace 
---------------- 
ai*b 
(1 row) 
Смежные вопросы