2015-02-11 3 views
1

У меня есть экспорт базы данных, который приходит с неправильной заменой chararacter (например, è => e '). Поэтому я должен изменить его в postgres.
я схожу с ума, чтобы сделать все в один регулярное выражение, поймать что-то вроде этого:postgres regexp_replace отрицать наличие последовательных групп символов

cassine' de' pecche' e' 

он должен стать

cassinè de' pecchè è 

(де»не должно измениться).

Я managet, чтобы получить его с двумя проход:

UPDATE mytable SET comun1=UPDATE mytable SET comun1=regexp_replace(column1,'([^dnNn])(e\'')', '\1\2è', 'g'); 

UPDATE mytable SET comun1=UPDATE mytable SET comun1=regexp_replace(column1,'([^\s])([dnNn])(e\'')', '\1\2è', 'g'); 

В основном я хочу, чтобы исключить из заменить пробел, затем d или п и с последующим е «(например," де») и изменить е во всех других случаях.
Я пробовал (?!\s[nNdD])(e\''), но он по-прежнему меняет «de» на «dè»

У кого-нибудь есть решение для этого?

+0

'(...?!)' Смотрит вперед не назад, а не просмотр назад существует в PostgreSQL регулярного выражения вкуса. –

ответ

1
select regexp_replace($$cassine' de' pecche' e'$$, $$(\s[^dn]?|\w\w)e'$$, '\1è', 'gi') 
    regexp_replace  
---------------------- 
cassinè de' pecchè è 
(1 row) 

Объяснение:

(\s[^dn]?|\w\w)e' 
^  ^ ^
|  |  followed by e' 
|  or 2 word chars 
space optionally followed by d or n 
+0

возможно, это можно было бы переписать следующим образом: '(\ s [^ dn]? | \ B \ w) e'' –

+0

Это пропускает замену в более длинных словах, заканчивающихся на e '. (например, cassine ') –

+0

Нет, почему? так как я использую '\ B' (привязку не-слова границы),' cassine'' соответствует. –

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