Thank you! 2016-08-15 18:36 GMT+05:00, hubert depesz lubaczewski <depesz@xxxxxxxxxx>: > On Mon, Aug 15, 2016 at 06:27:06PM +0500, Михаил wrote: >> I need to escape double quotes only: >> test=# select regexp_replace('"""{Performer,"Boomwacker ""a"" >> Recording""}"""', '([^"])"{2}([^"])', '\1\"\2', 'g'); >> regexp_replace >> ------------------------------------------------- >> """{Performer,"Boomwacker \"a"" Recording\"}""" >> >> This is unexpected result. >> >> But when added one symbol to ""a"" the result is right: >> test=# select regexp_replace('"""{Performer,"Boomwacker ""a1"" >> Recording""}"""', '([^"])"{2}([^"])', '\1\"\2', 'g'); >> regexp_replace >> -------------------------------------------------- >> """{Performer,"Boomwacker \"a1\" Recording\"}""" > > This is because when finding first "", "a" that is afterwards get > assigned to \2. and thus is already "used", and can't be part of > match for the second "". > > What will solve the problem is to use lookahead, like: > $ select regexp_replace('"""{Performer,"Boomwacker ""a"" Recording""}"""', > '([^"])"{2}(?=[^"])', '\1\"', 'g'); > regexp_replace > ------------------------------------------------- > """{Performer,"Boomwacker \"a\" Recording\"}""" > (1 row) > > because then the part inside (?=...) is not "used", and can be used for > next > match. > > Not sure if I'm clear, but hopefully you'll understand what I'm trying to > explain :) > > Best regards, > > depesz > > -- --- Regards, Mikhail -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general