On 25 October 2014 11:49, Francisco Olarte <fola...@peoplecall.com> wrote:
> Hi Thom: > > On Sat, Oct 25, 2014 at 11:24 AM, Thom Brown <t...@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