On 25 October 2014 11:49, Francisco Olarte <folarte@xxxxxxxxxxxxxx> wrote:
Hi Thom:On Sat, Oct 25, 2014 at 11:24 AM, Thom Brown <thom@xxxxxxxxx> wrote:It must be that I haven't had enough caffeine today, but I can't figure out why the following _expression_ captures the non-capturing part of the text:# SELECT regexp_matches('postgres','(?:g)r');regexp_matches----------------{gr}(1 row)Section 9.7.3, search for 'If the pattern contains no parenthesized subexpressions, then each row returned is a single-element text array containing the substring matching the whole pattern.'
Ah, I knew I missed something:
# SELECT regexp_matches('postgres','(?:g)(r)');
regexp_matches
----------------
{r}
(1 row)
Although I can see it's redundant in this form.
I'm expecting '{r}' in the output as I thought this would use ARE mode by default.Why r ? Your pattern is exactly the same as 'gr'. NOTHING gets captured. To get that you'll need the opposite 'g(r)' to capture it. By default nothing gets captured, the (?:...) construction is used because (....) does GROUPING and CAPTURING, and sometimes you want grouping WITHOUT capturing.
I'm familiar with regular _expression_ syntax, just famliarising myself with PostgreSQL's syntax flavour.
Thanks