I confini PostgreSQL Regex parola?
-
26-09-2019 - |
Domanda
Il supporto PostgreSQL \b
?
Sto cercando \bAB\b
ma non corrisponde a nulla, mentre (\W|^)AB(\W|$)
fa. Questi 2 espressioni sono essenzialmente la stessa, non è vero?
Soluzione
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
Regular Expression vincolo Escapes nel manuale.
C'è anche [[:<:]]
e [[:>:]]
, che corrisponde all'inizio e alla fine di una parola. Da manuale :
Ci sono due casi particolari di espressioni fra parentesi quadre: l'espressioni fra parentesi quadre
[[:<:]]
e[[:>:]]
sono vincoli, corrispondenti rispettivamente stringhe vuote all'inizio e alla fine di una parola. Una parola è definita come una sequenza di caratteri di parola che non è né preceduta né seguita da caratteri alfanumerici. Un carattere di parola è un carattere alnum (come definito dalla ctype) o una sottolineatura. Questa è un'estensione, compatibile con, ma non specificato da POSIX 1003.2, e deve essere usato con cautela in software per essere portabili ad altri sistemi. Le fughe di vincolo descritti di seguito sono generalmente preferibili (essi non sono più standard, ma sono certamente più facile tipo).
Altri suggerimenti
Un semplice esempio
select * from table_name where column ~* '\yAB\y';
Questa corrisponderà AB
ab
ab - text
text ab
text AB
text-ab-text
text AB text
...
Ma bisogna usare:
select * from sometable where name ~* '\\yAB\\y';
nel caso in cui si dispone di bandiera standard_conforming_strings
impostato su OFF
. Nota doppie barre
È possibile impostare manualmente:.
set standard_conforming_strings=on;
Quindi:. select * from table_name where column ~* '\yAB\y';
dovrebbe funzionare
ricerca di parola esatta nel testo:
Stavo affrontando seguente problema.
Ho voluto ricercare tutti i contatti che ha 'CTO' come parola esatta in titoli, ma nei risultati era ottenere risultati con il titolo che hanno 'direttore' in esso, stavo usando seguente query
select * from contacts where title ilike '%cto%';
Ho provato anche con whitspaces intorno jolly come '% CTO%', si stava facendo abbinato con il testo che contiene 'CTO', i risultati ottenuto come 'vp, CTO e manger', ma non i 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