Pattern Matching

Pattern Matching

am 07.07.2008 09:31:35 von Florian Aumeier

Guten Morgen allerseits

wie kann ich bei Postgres in einem Pattern eine Zeichenfolge ausschließ=
en?

Als Beispiel zwei unterschiedliche URL. Die erste URL soll gematched=20
werden, die zweite nicht:

a) 'http://asbojesus.wordpress.com/2007/03/02/14/'
b) 'http://feeds.wordpress.com/1.0/goreddit/globolibro.wordpres s.com/319/=
'

Meine Idee war es mit diesem Pattern zu machen

E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com'

was leider nicht funktioniert, da dass [^(feeds)] nicht nur die=20
Zeichenfolge 'feeds' ausschließt, sondern die einzelnen Zeichen 'f e d =
s'.

Zum testen:

SELECT * from=20
regexp_matches('http://asbojesus.wordpress.com/2007/03/02/14 /',=20
E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com');

SELECT * from=20
regexp_matches('http://feeds.wordpress.com/1.0/goreddit/glob olibro.wordpr=
ess.com/319/',=20
E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com');


Gruß
Florian

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Pattern Matching

am 07.07.2008 11:19:04 von Michael Renner

Florian Aumeier schrieb:
> Guten Morgen allerseits
>=20
> wie kann ich bei Postgres in einem Pattern eine Zeichenfolge ausschließ=
en?
>=20
> Als Beispiel zwei unterschiedliche URL. Die erste URL soll gematched=20
> werden, die zweite nicht:
>=20
> a) 'http://asbojesus.wordpress.com/2007/03/02/14/'
> b) 'http://feeds.wordpress.com/1.0/goreddit/globolibro.wordpres s.com/31=
9/'
>=20
> Meine Idee war es mit diesem Pattern zu machen
>=20
> E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com'
>=20
> was leider nicht funktioniert, da dass [^(feeds)] nicht nur die=20
> Zeichenfolge 'feeds' ausschließt, sondern die einzelnen Zeichen 'f e =
d s'.

Um das so umzusetzen brauchst du einen negative lookbefore [1]; ich bin=20
mir nicht sicher ob das in den PG PCRE implementiert ist.

Zum allgemeinen regex-basteln eignen sich Regex Coach [2] oder ähnliche=
=20
Tools ziemlich gut (interaktives Testen).

Und als Lösungsansatz würd ich unter der Annahme, dass die URLs einze=
ln=20
in einer Column stehen, ein "not ilike 'http://feeds.wordpress.com/%'"=20
empfehlen, das sollt auch relativ flott sein.


lg,
michael

[1] http://www.regular-expressions.info/lookaround.html
[2] http://www.weitz.de/regex-coach/

--=20

Michael Renner
InQnet GmbH
Praterstraße 31
A-1020 Wien

Tel.: +43 1 212 7650 521
Fax.: +43 1 212 7650 610

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Pattern Matching

am 07.07.2008 12:13:52 von Thomas Markus

This is a multi-part message in MIME format.
--------------060802010108080003070301
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: quoted-printable

hi,

versuchs doch mit mal so

select
a.c , a.c ~ '^http://(?!feeds)\..*'
from
(
select 'http://asbojesus.wordpress.com/2007/03/02/14/' as c=20
union all
select=20
'http://feeds.wordpress.com/1.0/goreddit/globolibro.wordpres s.com/319/' a=
s c
) a

aber das ilike vom michael ist eher anzuraten

gruss
Thomas


Florian Aumeier schrieb:
> Guten Morgen allerseits
>
> wie kann ich bei Postgres in einem Pattern eine Zeichenfolge=20
> ausschließen?
>
> Als Beispiel zwei unterschiedliche URL. Die erste URL soll gematched=20
> werden, die zweite nicht:
>
> a) 'http://asbojesus.wordpress.com/2007/03/02/14/'
> b)=20
> 'http://feeds.wordpress.com/1.0/goreddit/globolibro.wordpres s.com/319/'
>
> Meine Idee war es mit diesem Pattern zu machen
>
> E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com'
>
> was leider nicht funktioniert, da dass [^(feeds)] nicht nur die=20
> Zeichenfolge 'feeds' ausschließt, sondern die einzelnen Zeichen 'f e =
d=20
> s'.
>
> Zum testen:
>
> SELECT * from=20
> regexp_matches('http://asbojesus.wordpress.com/2007/03/02/14 /',=20
> E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com');
>
> SELECT * from=20
> regexp_matches('http://feeds.wordpress.com/1.0/goreddit/glob olibro.word=
press.com/319/',=20
> E'^http://[a-zA-Z0-9]+[^(feeds)]\.wordpress\.com');
>
>
> Gruß
> Florian
>


--------------060802010108080003070301
Content-Type: text/x-vcard; charset=utf-8;
name="t_markus.vcf"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="t_markus.vcf"

begin:vcard
fn:Thomas Markus
n:Markus;Thomas
org:proventis GmbH
adr:;;Zimmerstr. 79-80;Berlin;Berlin;10117;Germany
email;internet:t.markus@proventis.net
tel;work:+49 30 29 36 399 22
x-mozilla-html:FALSE
url:http://www.proventis.net
version:2.1
end:vcard


--------------060802010108080003070301
Content-Type: text/plain
Content-Disposition: inline
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

--------------060802010108080003070301--

Re: Pattern Matching

am 07.07.2008 12:39:14 von Florian Aumeier

Danke für die Hinweise, besonders an Michael.

Postgres hat den negativen und positiven lookahead implementiert und=20
damit funktioniert es so wie es soll.

SELECT 'http://feeds.wordpress.com' ~=20
E'^http://(?!feeds)[^.]+\\.wordpress\\.com';
?column?
----------
f
(1 row)

Und das zweite Beispiel ist true:

SELECT 'http://asbojesus.wordpress.com/2007/03/02/14/' ~=20
E'^http://(?!feeds)[^.]+\\.wordpress\\.com';
?column?
----------
t
(1 row)

Gruß
Florian


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Pattern Matching

am 07.07.2008 14:03:32 von Albe Laurenz

Florian Aumeier wrote:
> wie kann ich bei Postgres in einem Pattern eine Zeichenfolge=20
> ausschließen?
>=20
> Als Beispiel zwei unterschiedliche URL. Die erste URL soll gematched=20
> werden, die zweite nicht:
>=20
> a) 'http://asbojesus.wordpress.com/2007/03/02/14/'
> b) 'http://feeds.wordpress.com/1.0/goreddit/globolibro.wordpres s.com/319/'

Ich weiß nicht, ob es mit _einem_ Pattern geht.

Ich würde zwei nehmen:

(col ~ E'^http://[a-zA-Z0-9]*\.wordpress\.com') AND
(col !~ E'^http://[a-zA-Z0-9]*feeds.*\.wordpress\.com')

oder sowas in der Art.

Liebe Grüße,
Laurenz Albe

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