functions PostgreSQL Regex Word Boundaries?




postgresql regexp_matches (3)

PostgreSQL supporte-t-il \b ?

J'essaie \bAB\b mais cela ne correspond à rien, alors que (\W|^)AB(\W|$) fait. Ces 2 expressions sont essentiellement les mêmes, n'est-ce pas?


Answer #1

Recherche exacte par mot dans le texte:

Je faisais face au problème suivant.

Je voulais rechercher tous les contacts qui ont "cto" comme mot exact dans les titres, mais dans les résultats, on obtenait des résultats avec le titre ayant "directeur", j'ai utilisé la requête suivante

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

J'ai également essayé avec des espaces blancs autour du caractère générique tel que '% cto%', il était associé à un texte contenant 'cto', avec des résultats tels que 'vp, cto et gestionnaire', mais pas avec un titre exact comme 'cto'.

Je voulais à la fois "vp, cto and manger" et "cto" dans les résultats, mais pas "directeur" dans les résultats

Suivre a travaillé pour moi

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

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

Answer #2

PostgreSQL utilise \m , \M , \y et \Y comme limites de mots:

\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 

Voir Échappes de contraintes d’expressions régulières dans le manuel.

Il y a aussi [[:<:]] et [[:>:]] , qui correspondent au début et à la fin d'un mot. Du manuel :

Il existe deux cas spéciaux d'expressions entre crochets: les expressions entre crochets [[:<:]] et [[:>:]] sont des contraintes, qui correspondent à des chaînes vides au début et à la fin d'un mot, respectivement. Un mot est défini comme une séquence de caractères de mot qui n'est ni précédée ni suivie par des caractères de mot. Un caractère de mot est un caractère d'alnum (tel que défini par ctype) ou un trait de soulignement. Il s’agit d’une extension compatible avec POSIX 1003.2, mais non spécifiée, qui doit être utilisée avec prudence dans les logiciels destinés à être portables sur d’autres systèmes. Les échappements de contraintes décrits ci-dessous sont généralement préférables (ils ne sont plus standard, mais sont certainement plus faciles à saisir).


Answer #3

Un exemple simple

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

Cela correspond à AB ab ab - text text ab text AB text-ab-text text AB text ...

Mais vous devez utiliser:

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

au cas où le drapeau standard_conforming_strings serait défini sur OFF . Notez les doubles barres obliques .
Vous pouvez le définir manuellement:

set standard_conforming_strings=on;

Ensuite: select * from table_name where column ~* '\yAB\y'; devrait marcher.





word-boundary