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?

Foi útil?

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    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top