Re: Non-capturing expressions - Mailing list pgsql-general

From Thom Brown
Subject Re: Non-capturing expressions
Date
Msg-id CAA-aLv60OPWQzQY3bF3bDbFYuLCTzSwaWObxuKNJxqq9+19X9Q@mail.gmail.com
Whole thread Raw
In response to Non-capturing expressions  (Thom Brown <thom@linux.com>)
Responses Re: Non-capturing expressions  (Francisco Olarte <folarte@peoplecall.com>)
List pgsql-general
On 25 October 2014 11:49, Francisco Olarte <folarte@peoplecall.com> wrote:
Hi Thom:

On Sat, Oct 25, 2014 at 11:24 AM, Thom Brown <thom@linux.com> 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

Thom

pgsql-general by date:

Previous
From: Francisco Olarte
Date:
Subject: Re: Emulating flexible regex replace
Next
From: Oliver Kohll - Mailing Lists
Date:
Subject: Re: dblink password required