pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Craig Ringer <craig@postnewspapers.com.au>
To: pgsql-sql@postgresql.org
Subject: select regexp_matches('a a a', '([a-z]) a','g');
Date: Fri, 08 May 2009 13:26:14 +0800
Message-ID: <4A03C276.9050007@postnewspapers.com.au> (raw)

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



view thread (2+ messages)

Message-ID: <4A03C276.9050007@postnewspapers.com.au>
Permalink:  ../4A03C276.9050007@postnewspapers.com.au/
Also on:    postgresql.org/message-id/4A03C276.9050007@postnewspapers.com.au

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: craig@postnewspapers.com.au
  Subject: Re: select regexp_matches('a a a', '([a-z]) a','g');
  In-Reply-To: <4A03C276.9050007@postnewspapers.com.au>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox