Los límites de PostgreSQL Regex palabra?
-
26-09-2019 - |
Pregunta
PostgreSQL \b
apoyo?
Estoy intentando \bAB\b
pero no coincide con nada, mientras que (\W|^)AB(\W|$)
hace. Estos 2 expresiones son esencialmente los mismos, no son?
Solución
PostgreSQL usa \m
, \M
, \y
y \Y
como límites de las palabras:
\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
de expresiones regulares de restricción Escapes en el manual.
También hay [[:<:]]
y [[:>:]]
, que coincide con el comienzo y el final de una palabra. De el manual de :
Hay dos casos especiales de expresiones con corchetes: el soporte de expresiones
[[:<:]]
y[[:>:]]
son limitaciones, haciendo coincidir las cadenas vacías al principio y al final de una palabra, respectivamente. Una palabra se define como una secuencia de caracteres de palabra que ni está precedido ni siguieron por caracteres de palabra. Un carácter de palabra es un carácter alnum (como se define por ctype) o un subrayado. Esta es una extensión, compatible con, pero no especificada por POSIX 1003.2, y se debe utilizar con precaución en software destinado a ser portable a otros sistemas. Los escapes de restricción describen a continuación son por lo general preferible (que no más estándar son, pero son ciertamente más fácil de tipo).
Otros consejos
Un ejemplo sencillo
select * from table_name where column ~* '\yAB\y';
Esto corresponderá con AB
ab
ab - text
text ab
text AB
text-ab-text
text AB text
...
Pero hay que usar:
select * from sometable where name ~* '\\yAB\\y';
en caso de tener bandera standard_conforming_strings
establecido en OFF
. Tenga en cuenta los dos barras Todo lo que pueda establecer de forma manual:.
set standard_conforming_strings=on;
A continuación:. select * from table_name where column ~* '\yAB\y';
debe trabajar
exacta búsqueda de palabras en el texto:
Yo estaba frente siguiente problema.
Yo quería buscar todos los contactos que tiene 'cto' como la palabra exacta en títulos, pero en los resultados era conseguir resultados con el título que tienen 'director' en ella, yo estaba usando siguiente consulta ??p>
select * from contacts where title ilike '%cto%';
También trató con whitspaces alrededor de comodín como '% cto%', que se iba a coincidir con el texto que contiene 'cto', resultados que se obtienen como 'vp, CTO y el pesebre', pero no resultados con título exacto como 'cto' .
Me quería tanto 'vp, CTO y el pesebre' y 'cto' en los resultados, pero no 'director' en los resultados
A continuación trabajó para mí
select * from contacts where title ~* '\\ycto\\y';
~ Matches regular expression, case sensitive
~* Matches regular expression, case insensitive