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