On Thu, Jan 14, 2016 at 12:43 PM, Andy Colson <andy@xxxxxxxxxxxxxxx> wrote:
Hi all.
This is not doing as I'd expected:
select regexp_replace('71.09.6.01.3', '(\d)[.-](\d)', '\1\2', 'g');
regexp_replace
----------------
71096.013
(1 row)
Solution: select regexp_replace('71.09.6.01.3', '(\d)[.-](?=\d)', '\1\2', 'g');
Reason: in the original the trailing "(\d)" eats the digit following the symbol and then that digit is no longer available for matching the preceding digit in the _expression_. IOW the same character cannot be used to match both the first \d and the second \d so once the first \d captures the 6 there is no \d to match before trailing period.
By using the construct (?:\d) you are zero-width (non-capturing) asserting the the next character is a digit but you are not consuming it and so the continuation of the global matching still has that character to match the first \d.
David J.