regulares regexp_substr regexp_replace regexp_matches postgres expresiones example ejemplos regex postgresql word-boundary

regexp_substr - regexp_replace postgresql ejemplos



¿PostgreSQL Regex Word Boundaries? (3)

¿PostgreSQL soporta /b ?

Estoy intentando /bAB/b pero no coincide con nada, mientras que (/W|^)AB(/W|$) sí. Estas 2 expresiones son esencialmente las mismas, ¿no?


Búsqueda exacta de palabras en el texto:

Me enfrentaba al siguiente problema.

Quería buscar en todos los contactos que tienen ''cto'' como palabra exacta en los títulos, pero en los resultados obtuve resultados con el título que tenía ''director'', estaba usando la siguiente consulta

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

También probé con espacios en blanco alrededor de comodines como ''% cto%'', fue emparejado con texto que contiene ''cto'', obtuvo resultados como ''vp, cto y manger'', pero no resultados con el título exacto como ''cto''.

Quería tanto ''vp, cto y manger'' como ''cto'' en los resultados, pero no ''director'' en los resultados

Los siguientes me funcionaron

select * from contacts where title ~* ''//ycto//y''; ~ Matches regular expression, case sensitive ~* Matches regular expression, case insensitive


PostgreSQL usa /m , /M , /y y /Y como límites de 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

Consulte Escapes de restricción de expresión regular en el manual.

También hay [[:<:]] y [[:>:]] , que coinciden con el principio y el final de una palabra. Del manual :

Hay dos casos especiales de expresiones de corchete: las expresiones de corchete [[:<:]] y [[:>:]] son restricciones, que coinciden con cadenas vacías al principio y al final de una palabra, respectivamente. Una palabra se define como una secuencia de caracteres de palabras que no está precedida ni seguida por caracteres de palabras. Un carácter de palabra es un carácter alnum (según lo define ctype) o un guión bajo. Esta es una extensión, compatible con pero no especificada por POSIX 1003.2, y debe usarse con precaución en el software destinado a ser portátil a otros sistemas. Las restricciones de escape que se describen a continuación son generalmente preferibles (no son más estándar, pero ciertamente son más fáciles de escribir).


Un ejemplo simple

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

Esto coincidirá con AB ab ab - text text ab text AB text-ab-text text AB text ...

Pero tienes que usar:

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

en caso de que tengas standard_conforming_strings bandera standard_conforming_strings configurada en OFF . Tenga en cuenta las barras diagonales dobles .
Puedes configurarlo manualmente:

set standard_conforming_strings=on;

Luego: select * from table_name where column ~* ''/yAB/y''; Deberia trabajar.