PostGresql Regex Word limites?
-
26-09-2019 - |
Pergunta
PostGresql Support \b
?
estou tentando \bAB\b
Mas não corresponde nada, enquanto (\W|^)AB(\W|$)
faz. Essas duas expressões são essencialmente as mesmas, não são?
Solução
PostgreSQL usa \m
, \M
, \y
e \Y
como limites das palavras:
\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 Restrição de expressão regular escape no manual.
Há também [[:<:]]
e [[:>:]]
, que correspondem ao início e ao fim de uma palavra. A partir de o manual:
Existem dois casos especiais de expressões de suporte: as expressões de suporte
[[:<:]]
e[[:>:]]
são restrições, combinando seqüências vazias no início e no final de uma palavra, respectivamente. Uma palavra é definida como uma sequência de caracteres do Word que não é precedido nem seguido por caracteres do Word. Um personagem Word é um caractere de alnum (conforme definido pelo CTYPE) ou um sublinhado. Esta é uma extensão, compatível com, mas não especificada pelo POSIX 1003.2, e deve ser usada com cautela no software destinado a ser portátil para outros sistemas. As escadas de restrição descritas abaixo são geralmente preferíveis (elas não são mais padrão, mas certamente são mais fáceis de digitar).
Outras dicas
Um exemplo simples
select * from table_name where column ~* '\yAB\y';
Isso vai corresponder AB
ab
ab - text
text ab
text AB
text-ab-text
text AB text
...
Mas você tem que usar:
select * from sometable where name ~* '\\yAB\\y';
no caso de você ter standard_conforming_strings
sinalizador definido como OFF
. Note o barras duplas.
Você pode defini -lo manualmente:
set standard_conforming_strings=on;
Então :select * from table_name where column ~* '\yAB\y';
Deveria trabalhar.
Pesquisa exata de palavras no texto:
Eu estava enfrentando o seguinte problema.
Eu queria pesquisar todos os contatos que têm 'CTO' como palavra exata nos títulos, mas nos resultados estava obtendo resultados com o título com 'diretor', eu estava usando a consulta seguinte
select * from contacts where title ilike '%cto%';
Eu também tentei com espaços de branco em torno do curinga como ' % CTO %', estava sendo comparado ao texto que contém 'CTO', obteve resultados como 'VP, CTO e Manger', mas não resulta com o título exato como 'CTO'.
Eu queria 'vice
Seguinte funcionou para mim
select * from contacts where title ~* '\\ycto\\y';
~ Matches regular expression, case sensitive
~* Matches regular expression, case insensitive