Границы слов PostgreSQL Regex?

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

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


person mpen    schedule 29.09.2010    source источник


Ответы (3)


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, но не указано в нем, и его следует использовать с осторожностью в программном обеспечении, предназначенном для переноса на другие системы. Эскейп-побеги, описанные ниже, обычно предпочтительнее (они не более стандартны, но, безусловно, их легче набирать).

person Daniel Vandersluis    schedule 29.09.2010

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

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'; должно работать.

person MD. Mohiuddin Ahmed    schedule 03.01.2015
comment
Я использую postgres 9.3.10, и value ~* '\yAB\y' работает нормально. Ваша заметка относится к версии 9.2? - person Alexander Gonchiy; 07.02.2016
comment
То же самое, re: postgres 10.2: ... where synonyms ~* '\ya1b\y'; работает; версия с двойной обратной косой чертой '\\ya1b\\y' не работает. - person Victoria Stuart; 07.05.2018

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

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

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

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

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

Я хотел, чтобы в результатах были как «вице-президент, технический директор и менеджер», так и «технический директор», но не «директор» в результатах.

Следующее сработало для меня

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

~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive    
person Pramod Shinde    schedule 22.04.2015
comment
Когда вы соответствуете phrase ILIKE '% cto %, вам просто нужно добавить пробелы вокруг фразы: ' ' || phrase || ' ' ILIKE '% cto %'. Это будет работать для заголовка как «cto». Спасибо, потому что ваша идея помогла мне найти это решение: сопоставить границы слов postgresql 9"> stackoverflow.com/questions/18080104/ - person Stepan Zakharov; 05.11.2017