can't be both non-capturing and still capture

Started by Nonamealmost 9 years ago2 messagesdocs
Jump to latest
#1Noname
srn@coolheads.com

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/9.6/static/index.html
Description:

In postgresql-doc-9.5/html/functions-matching.html#POSIX-MATCHING-RULES:

<PRE
CLASS="SCREEN"
>SELECT regexp_matches('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}');
<I
CLASS="LINEANNOTATION"
>Result: </I
><SAMP
CLASS="COMPUTEROUTPUT"
>{abc,01234,xyz}</SAMP
></PRE
>

Here, the whole regexp is non-capturing, right, so how can the result be
reported as shown?

The previous two warmup examples do not have the surrounding
non-capturing-group markup. Looks to me like that markup should not appear
here, either.

--
Sent via pgsql-docs mailing list (pgsql-docs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-docs

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Noname (#1)
Re: can't be both non-capturing and still capture

srn@coolheads.com writes:

Here, the whole regexp is non-capturing, right, so how can the result be
reported as shown?

No, the outer parens are non-capturing, but the ones inside them still
are capturing parens.

Perhaps it would clarify matters if you tried it with plain outer parens:

=# SELECT regexp_matches('abc01234xyz', '((.*?)(\d+)(.*)){1,1}');
regexp_matches
-----------------------------
{abc01234xyz,abc,01234,xyz}
(1 row)

In this case we get a report from each of the four sets of capturing
parens. Or another example:

=# SELECT regexp_matches('abc01234xyz', '((?:.*?)(\d+)(.*)){1,1}');
regexp_matches
-------------------------
{abc01234xyz,01234,xyz}
(1 row)

Outer parens capture, first inner set don't, other two inner sets do.

regards, tom lane

--
Sent via pgsql-docs mailing list (pgsql-docs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-docs