PostgreSQL Regex Word Границы? - PullRequest
       22

PostgreSQL Regex Word Границы?

56 голосов
/ 30 сентября 2010

Поддерживает ли PostgreSQL \b?

Я пытаюсь \bAB\b, но ничего не соответствует, тогда как (\W|^)AB(\W|$) делает.Эти 2 выражения по сути одинаковы, не так ли?

Ответы [ 3 ]

72 голосов
/ 30 сентября 2010

PostgreSQL использует \m, \M, \y и \Y в качестве границ слова:

\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 

См. Побег ограничения регулярного выражения в руководстве.*

Также есть [[:<:]] и [[:>:]], которые соответствуют началу и концу слова.Из руководства :

Существует два особых случая выражений в скобках: выражения в скобках [[:<:]] и [[:>:]] являются ограничениями, соответствующими пустым строкам в начале и в концеслово соответственно.Слово определяется как последовательность символов слова, которая не предшествует и не сопровождается символами слова.Символ слова - это символ alnum (как определено ctype) или знак подчеркивания.Это расширение, совместимое, но не указанное в POSIX 1003.2, и его следует использовать с осторожностью в программном обеспечении, предназначенном для переноса на другие системы.Описанные ниже экранированные ограничения обычно предпочтительны (они не являются более стандартными, но их легче набирать).

14 голосов
/ 03 января 2015

Простой пример

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

Это будет соответствовать AB ab ab - text text ab text AB text-ab-text text AB text ...

Но вы должны использовать:

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

в случае, если для флага standard_conforming_strings установлено значение OFF.Обратите внимание на двойные косые черты .Вы можете установить его вручную:

set standard_conforming_strings=on;

Тогда: select * from table_name where column ~* '\yAB\y'; должно работать.

2 голосов
/ 22 апреля 2015

Точный поиск слова в тексте:

Я столкнулся со следующей проблемой.

Я хотел найти все контакты, в слове которых указано «cto» как точное слово, но в результатах получал результаты.с заголовком, содержащим 'Director', я использовал следующий запрос

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

Я также пробовал с пробелами вокруг подстановочного знака как "% cto%", он соответствовал тексту, который содержит "cto",результаты типа «vp, cto and manger», но не результаты с точным названием «cto».

Я хотел, чтобы 'vp, cto и manger' и 'cto' в результатах, но не 'Director' в результатах

Следование сработало для меня

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

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