2010-09-29 7 views
41

PostgreSQL supporta \b?Confini Word Regex PostgreSQL?

Sto cercando \bAB\b ma non corrisponde a nulla, mentre lo fa (\W|^)AB(\W|$). Queste 2 espressioni sono essenzialmente le stesse, no?

risposta

51

PostgreSQL utilizza \m, \M, \y e \Y come confini di parola:

\m matches only at the beginning of a word 
\M matches only at the end of a word 
\y matches only at the beginning or end of a word 
\Y matches only at a point that is not the beginning or end of a word 

Vedi Regular Expression Constraint Escapes nel manuale.

C'è anche [[:<:]] e [[:>:]], che corrispondono all'inizio e alla fine di una parola. Da the manual:

Ci sono due casi particolari di espressioni fra parentesi quadre: la staffa Espressioni [[:<:]] e [[:>:]] sono vincoli, corrispondenti rispettivamente stringhe vuote all'inizio e alla fine di una parola. Una parola è definita come una sequenza di caratteri di parole che non è né preceduta né seguita da caratteri di parole. Un carattere word è un carattere alnum (come definito da ctype) o un carattere di sottolineatura. Questa è un'estensione, compatibile ma non specificata da POSIX 1003.2, e dovrebbe essere usata con cautela in un software destinato a essere trasferibile su altri sistemi. Le fughe di vincoli descritte di seguito sono generalmente preferibili (non sono più standard, ma sono certamente più facili da scrivere).

+1

Nizza! Grazie! Penso di aver trovato quella pagina nelle mie ricerche su Google, ma non penso di averlo fatto scorrere abbastanza lontano :) – mpen

11

Un semplice esempio

select * from table_name where column ~* '\yAB\y'; 

questo funzionerà in 9.1 e matche AB ab ab - text text ab text AB text-ab-text text AB text ...

Ma devi essere Caref ul in 9.2. è necessario utilizzare:

select * from sometable where name ~* '\\yAB\\y'; 

Nota i doppie barre.
Nel 9.2 il standard_conforming_strings è impostato su OFF da default.But è possibile impostare manualmente:

set standard_conforming_strings=on; 

Poi: select * from table_name where column ~* '\yAB\y'; dovrebbe funzionare.

+1

Uso Postgres 9.3.10 e 'value ~ * '\ yAB \ y'' funziona bene. La tua nota 9.2 è specifica? –

1

ricerca di parola esatta nel testo:

Stavo affrontando seguente problema.

ho voluto cercare tutti i contatti che ha 'CTO' come parola esatta in titoli, ma nei risultati era ottenere risultati con il titolo che hanno 'direttore' in essa, stavo usando seguente query

select * from contacts where title ilike '%cto%'; 

anche io provato con whitspaces attorno a caratteri jolly come '% cto%', è stato abbinato al testo che contiene 'cto', ha ottenuto risultati come 'vp, cto e manger', ma non ha risultati con titolo esatto come 'cto'.

ho voluto sia 'vp, CTO e manger' e 'CTO' nei risultati, ma non e 'il regista' nei risultati

In seguito ha lavorato per me

select * from contacts where title ~* '\\ycto\\y'; 

~ Matches regular expression, case sensitive 
~* Matches regular expression, case insensitive  
+0

Quando si abbina la frase 'ILIKE '% cto%', è sufficiente aggiungere spazi attorno alla frase: '' '|| frase || '' ILIKE '% cto%' '. Funzionerà per titolo come 'cto'. Grazie, perché la tua idea mi aiuta a trovare questa soluzione: https://stackoverflow.com/questions/18080104/ilike-match-word-boundaries-postgresql-9/47120301#47120301 –