2010-09-29 8 views
41

¿PostgreSQL es compatible con \b?PostgreSQL Regex Word Boundaries?

Estoy tratando \bAB\b pero no coincide con nada, mientras que (\W|^)AB(\W|$) lo hace. Estas 2 expresiones son esencialmente las mismas, ¿verdad?

Respuesta

51

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 

Ver Regular Expression Constraint Escapes en el manual. También hay [[:<:]] y [[:>:]], que coinciden con el principio y el final de una palabra. De the manual:

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 no está precedida ni seguida por caracteres de palabra. Un carácter de palabra es un carácter alnum (como se define por ctype) o un guión bajo. Esta es una extensión, compatible con POSIX 1003.2 pero no especificada, y debe utilizarse con precaución en software destinado a ser portátil para otros sistemas. Las restricciones de escape descritas a continuación son generalmente preferibles (ya no son estándar, pero son más fáciles de escribir).

+1

Nice! ¡Gracias! Creo que encontré esa página en mis búsquedas de Google, pero no creo que me haya desplazado lo suficiente :) – mpen

11

Un ejemplo sencillo

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

Esto funcionará en 9.1 y matche AB ab ab - text text ab text AB text-ab-text text AB text ...

Pero hay que ser Caref ul en 9.2. usted tiene que utilizar:

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

Nota las dos barras.
En el standard_conforming_strings 9.2 se establece en OFF por default.But se puede establecer de forma manual:

set standard_conforming_strings=on; 

continuación: select * from table_name where column ~* '\yAB\y'; debería funcionar.

+1

Uso postgres 9.3.10 y 'value ~ * '\ yAB \ y'' funciona bien. ¿Es su nota específica de 9.2? –

1

exacta búsqueda de palabras en el texto:

que estaba enfrentando siguiente problema.

yo quería buscar todos los contactos que tiene 'cto' como la palabra exacta en los títulos, sino en resultados fue la obtención de resultados con el título que tienen 'director' en ella, yo estaba usando siguiente consulta

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

también intenté con whitspaces alrededor de comodín como '% cto%', se estaba emparejando con texto que contiene 'cto', obtenía resultados como 'vp, cto y manger', pero no daba como resultado el título exacto como 'cto'.

me querían tanto 'vp, CTO y el pesebre' y 'cto' en los resultados, pero no 'director' en los resultados de

A continuación trabajó para mí

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

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

Cuando combina 'frase ILIKE '% cto%', solo necesita agregar espacios alrededor de la frase: '' '|| frase || '' ILIKE '% cto%' '. Esto funcionará para el título como 'cto'. Gracias, porque tu idea me ayuda a encontrar esta solución: https://stackoverflow.com/questions/18080104/ilike-match-word-boundaries-postgresql-9/47120301#47120301 –