On Thu, Jan 14, 2016 at 12:43 PM, Andy Colson <a...@squeakycode.net> 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.

Reply via email to