From: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
---|---|
To: | Andy Colson <andy(at)squeakycode(dot)net> |
Cc: | pgsql <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: regexp_replace |
Date: | 2016-01-14 20:06:39 |
Message-ID: | CAKFQuwb6Ev2nbB=V-162tdaZ5hVB5d6DmYLYiFaqdV8xj8AW7A@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Thu, Jan 14, 2016 at 12:43 PM, Andy Colson <andy(at)squeakycode(dot)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.
From | Date | Subject | |
---|---|---|---|
Next Message | Andy Colson | 2016-01-14 20:08:20 | Re: regexp_replace |
Previous Message | Andy Colson | 2016-01-14 20:03:26 | Re: regexp_replace |