PostgreSQL Regex de mots limites?
-
26-09-2019 - |
Question
Est-ce que PostgreSQL \b
?
Je suis en train \bAB\b
mais il ne correspond pas à quoi que ce soit, alors que le fait (\W|^)AB(\W|$)
. Ces 2 expressions sont essentiellement les mêmes, ne sont-ils?
La solution
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 Expression régulière Constraint Escapes dans le manuel.
Il y a aussi [[:<:]]
et [[:>:]]
, qui correspondent au début et à la fin d'un mot. De manuel:
Il existe deux cas particuliers d'expressions entre crochets: les expressions du support
[[:<:]]
et[[:>:]]
sont contraintes, correspondant à 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 mots qui ne sont ni précédé, ni suivi de caractères de texte. Un caractère de mot est un caractère alnum (tel que défini par ctype) ou un trait de soulignement. Ceci est une extension compatible mais non spécifiée par POSIX 1003.2, et doit être utilisé avec prudence dans les logiciels destinés à être portables à d'autres systèmes. Les évasions de contraintes décrites ci-dessous sont généralement préférables (ils ne sont pas plus standard, mais sont certainement plus facile de taper).
Autres conseils
Un simple exemple
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';
Si vous avez drapeau standard_conforming_strings
mis à OFF
. Notez les doubles barres obliques Vous pouvez régler manuellement:.
set standard_conforming_strings=on;
Alors:. select * from table_name where column ~* '\yAB\y';
devrait fonctionner
recherche exacte des mots dans le texte:
Je faisais face à problème suivant.
Je voulais rechercher tous les contacts qui a « oi » comme mot exact dans les titres, mais dans les résultats était d'obtenir des résultats avec le titre ayant « directeur » dans, j'utilisais requête suivante
select * from contacts where title ilike '%cto%';
J'ai aussi essayé avec whitspaces autour de caractères génériques comme « % oi% », il commençait à faire correspondre avec le texte qui contient « oi », a obtenu des résultats comme « Vice-président, directeur technique et manger », mais pas de résultats avec le titre exact comme « oi » .
Je voulais à la fois « Vice-président, directeur technique et manger » et « oi » dans les résultats, mais pas « directeur » dans les résultats
Suite à travaillé pour moi
select * from contacts where title ~* '\\ycto\\y';
~ Matches regular expression, case sensitive
~* Matches regular expression, case insensitive