From: | Craig Ringer <craig(at)postnewspapers(dot)com(dot)au> |
---|---|
To: | pgsql-sql(at)postgresql(dot)org |
Subject: | select regexp_matches('a a a', '([a-z]) a','g'); |
Date: | 2009-05-08 05:26:14 |
Message-ID: | 4A03C276.9050007@postnewspapers.com.au |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
First: Please don't reply to an existing message to create a new thread.
Your mail client copies the replied-to message ID into the References:
header, and well-implemented mail clients will thread your message under
a now-unrelated thread.
Compose a new message instead.
Marc Mamin wrote:
> I have a string that contains a serie of chars, separated by single
> spaces.
>
> e.g 'a b x n r a b c b'
>
> Having such a string, I d'like to get a list of all predecessors of a
> given character.
> In the example, the predecessors of b are a,a,c.
OK, so wherever `b' occurs, you want the character at index `b -2'.
> select regexp_matches('a a a', '([a-z]) a','g');
> => {"a "} only
The issue is that regular expressions don't like to overlap matches. The
first match consumes _two_ leading `a' characters.
What you need is a zero-width lookahead assertion, available in
Perl-style extended regular expressions. Handily, recent PostgreSQL
versions support these, so you can write:
test=> select regexp_matches( 'a a a', '([a-z]) (?=a)', 'g');
regexp_matches
----------------
{a}
{a}
(2 rows)
--
Craig Ringer
From | Date | Subject | |
---|---|---|---|
Next Message | Luigi N. Puleio | 2009-05-08 09:05:08 | RAISE NOTICE |
Previous Message | Scott Marlowe | 2009-05-07 18:54:09 | Re: Distinct oddity |