Newsgroup: it.comp.lang.perl
Titolo: domanda sulle regexp

Salve a tutti,
ho un problema con le regexp che penso sia facile, ma non ho trovato
nessun tutorial in grado di suggerirmi la risposta e quindi chiedo a voi.
Il mio scopo č quello di fare delle ricerche dentro postgresql, che
oltre ad avere like e ilike prevede l'uso delle regexp per fare il
matching. Come faccio a fare una gexexp che trovi tutti i record che
contengono delle chiavi di ricerca?
Esempio, per essere piů chiaro, dati i record:
pasta al pomodoro
bis di gnocchi al ragů e pasta in bianco
pasta fredda al pesto
pasta allo scoglio
qual'č la regexp che mi torna i record che contengono le parole "pasta"
e "al" ? Il problema č che io ci sarei quasi arrivato se l'ordine delle
chiavi  fosse fisso, basta un ^*pasta*al*$ , ma cosě non seleziono  la
seconda riga, cosa che invece desidererei.
Non voglio calcolare dinamicamente tutte le permutazioni delle chiavi,
sarebbe troppo complicato.
Qualcuno di voi ha delle idee?
Grazie

sarebbe troppo complicato.
La cosa concettualmente piů semplice č fare un and fra due match distinti,
anche se non so che effetto possa avere sulle prestazioni. Non conosco
abbastanza postgresql per poter dire se ci sia un'altra strada.
Ciao.

 abbastanza postgresql per poter dire se ci sia un'altra strada.
adesso penso come farlo in sql.


la regexp che proponi e' sbagliata.
se vuoi trovare i campi con la parola "pasta" e la parola "al",
la regex da uasre e' "[[:<:]]pasta[[:>:]].*[[:<:]]al[[:>:]]"
(sintassi POSIX. vedi i dettagli qui:
http://www.postgresql.org/docs/8.1/static/functions-matching.html#POSIX-BRACKET-EXPRESSIONS
 )
Se non usi i separatori di parola ("[[:<:]]"), ti trova anche espressioni come "pastaro calloso" o "rimpasta la nuova
coalizione dalla vecchia". :)
ciao
gmax
-- 
 _  _ _  _
(_|| | |(_|><  The Data Charmer
 _|
http://datacharmer.org/

 coalizione dalla vecchia". :)
ma fa anche le permutazioni?mi sembra di no....


Cosa intendi per "permutazioni"? Un esempio?
Se intendi le alternanze, sono supportate.


 Qualcuno di voi ha delle idee?
Si fa così (ti scrivo la /search condition/ della clausola WHERE, 
supponendo che il nome del campo sia "pietanza").
Se proprio vuoi utilizzare un'unica regex che fa l'AND di 2 pattern 
(considera che le regex Postgres *non* sono le regex Perl, come già 
detto da Giuseppe Maxia):
pietanza ~* '(?:[[:<:]]pasta[[:>:]].*[[:<:]]al[[:>:]]) |
(?:[[:<:]]al[[:>:]].*[[:<:]]pasta[[:>:]])'
oppure puoi adottare la soluzione consigliata da Giovanni Zezza, che 
secondo me è più leggibile ed anche più efficiente:
pietanza ~* '[[:<:]]pasta[[:>:]]' AND pietanza ~* '[[:<:]]al[[:>:]]'
Detto questo, considera che le regex bypassano gli eventuali indici 
creati sul campo, per cui la query risulterebbe piuttosto lenta (almeno 
su recordset molto estesi).
Questa è la tipica situazione in cui sarebbe meglio usare una ricerca 
full-text basata su inverted index.
Per farlo direttamente con PostgreSQL, guarda qui:
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/
Ciao,
Emanuele.

 Cosa intendi per "permutazioni"? Un esempio?
Credo intenda che vuole matchare anche quei record in cui la stringa 
"al" compare nel campo prima della stringa "pasta", come ad esempio in:
bis di gnocchi al ragų e pasta in bianco
(almeno secondo l'interpretazione che ho dato io nella risposta).
Ciao,
Emanuele.

 (almeno secondo l'interpretazione che ho dato io nella risposta).
esatto

 
http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/
adesso lo studio, grazie

 adesso lo studio, grazie
Ti segnalo anche un paio di soluzioni alternative per l'FTS, più 
semplici di tsearch (che in effetti non è il massimo per semplicità e 
"maneggevolezza"):
http://openfts.sourceforge.net/
http://search.cpan.org/~dkoch/DBIx-TextIndex-0.25/
Questo per limitarsi ai soli FTS engine che lavorano con Postgres senza 
la gestione dell'inverted index su back-end separati, altrimenti su CPAN 
c'è anche un sacco di altra roba (e ce n'è anche sicuramente almeno un 
altro che lavora esclusivamente con Postgres, solo che adesso non riesco 
a ritrovarlo :-(
Ciao,
Emanuele.

 devi passarti riga per riga, ma direi che (pasta.*al|al.*pasta) funziona
ma questa ha il problema che devo fare le permutazioni a mano, e sono n!
comunque ho risolto in modo completamente diverso, uso INTERSECT di sql
e faccio più query. Probabilmente è più lento, ma mi è più facile da
gestire.
Grazie a tutti.

 a ritrovarlo :-(
Grazie mille, le tue informazioni sono molto preziose. :-)