select all matches for a regular expression ?

Started by Anton Melserabout 19 years ago6 messagesgeneral
Jump to latest
#1Anton Melser
melser.anton@gmail.com

Hi,
I need to be able to get all the matches for a particular regexp from
a text field that I need to use in another query in a function. Is
this possible with plpgsql? Do I have to install the perl language?
Cheers
Anton

#2Peter Childs
peterachilds@gmail.com
In reply to: Anton Melser (#1)
Re: select all matches for a regular expression ?

On 23/02/07, Anton Melser <melser.anton@gmail.com> wrote:

Hi,
I need to be able to get all the matches for a particular regexp from
a text field that I need to use in another query in a function. Is
this possible with plpgsql? Do I have to install the perl language?
Cheers
Anton

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

yes. use "like" or "~"

see
http://www.postgresql.org/docs/8.2/static/functions-matching.html

There is no need to use perl.

Peter.

#3Anton Melser
melser.anton@gmail.com
In reply to: Peter Childs (#2)
Re: select all matches for a regular expression ?

On 23/02/07, Peter Childs <peterachilds@gmail.com> wrote:

On 23/02/07, Anton Melser <melser.anton@gmail.com> wrote:

Hi,
I need to be able to get all the matches for a particular regexp from
a text field that I need to use in another query in a function. Is
this possible with plpgsql? Do I have to install the perl language?
Cheers
Anton

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

yes. use "like" or "~"

see
http://www.postgresql.org/docs/8.2/static/functions-matching.html

There is no need to use perl.

... I have read and re-read that page many times - I must be stupid
:-(. For me both like and ~ on an expression will return true or
false, and not a set of values. I have managed to get *one* value with
substring(), but I need to get them all...
As an example, I need to find all the occurences of digits in the following text

myvar := 'hello4 is 4 very n1ce num8er';

so select substrings(myvar, '([0-9]));

will return
4
4
1
8

Is *this* possible without perl? Could you give a paragraph number on
that page if the info is there so I know exactly where to look?
Thanks again,
Anton

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Anton Melser (#1)
Re: select all matches for a regular expression ?

"Anton Melser" <melser.anton@gmail.com> writes:

I need to be able to get all the matches for a particular regexp from
a text field that I need to use in another query in a function. Is
this possible with plpgsql? Do I have to install the perl language?

You need plperl (or pltcl; likely plpython would work too) --- the
built-in regex functions don't have any way to return more than the
first match. There's a patch pending to provide more functionality
here for 8.3, but it won't help you today.

regards, tom lane

#5Anton Melser
melser.anton@gmail.com
In reply to: Tom Lane (#4)
Re: select all matches for a regular expression ?

On 23/02/07, Tom Lane <tgl@sss.pgh.pa.us> wrote:

"Anton Melser" <melser.anton@gmail.com> writes:

I need to be able to get all the matches for a particular regexp from
a text field that I need to use in another query in a function. Is
this possible with plpgsql? Do I have to install the perl language?

You need plperl (or pltcl; likely plpython would work too) --- the
built-in regex functions don't have any way to return more than the
first match. There's a patch pending to provide more functionality
here for 8.3, but it won't help you today.

Thanks for the info
Cheers
Anton

#6ksherlock@gmail.com
ksherlock@gmail.com
In reply to: Anton Melser (#5)
Re: select all matches for a regular expression ?

I'm going to disagree and say it can be done (maybe).

Use regexp_replace() to convert non-numeric characters. Depending on
your final needs, you could leave it as a comma-separated list or
split it to an array.

select string_to_array(regexp_replace(regexp_replace('hello4 is 4 very
n1ce num8er', '[^0-9]+', ',', 'g'), '^,|,$', '', 'g'),',');

{4,4,1,8}

Show quoted text

On Feb 23, 10:18 am, melser.an...@gmail.com ("Anton Melser") wrote:

On 23/02/07, Tom Lane <t...@sss.pgh.pa.us> wrote:

"Anton Melser" <melser.an...@gmail.com> writes:

I need to be able to get all the matches for a particular regexp from
a text field that I need to use in another query in a function. Is
this possible with plpgsql? Do I have to install the perl language?

You need plperl (or pltcl; likely plpython would work too) --- the
built-in regex functions don't have any way to return more than the
first match. There's a patch pending to provide more functionality
here for 8.3, but it won't help you today.

Thanks for the info
Cheers
Anton

---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

http://archives.postgresql.org/