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

Reply via email to