Поддерживает ли PostgreSQL \b
?
Я пробую \bAB\b
, но он ничему не соответствует, тогда как (\W|^)AB(\W|$)
соответствует. Эти 2 выражения по сути одинаковы, не так ли?
Поддерживает ли PostgreSQL \b
?
Я пробую \bAB\b
, но он ничему не соответствует, тогда как (\W|^)AB(\W|$)
соответствует. Эти 2 выражения по сути одинаковы, не так ли?
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, но не указано в нем, и его следует использовать с осторожностью в программном обеспечении, предназначенном для переноса на другие системы. Эскейп-побеги, описанные ниже, обычно предпочтительнее (они не более стандартны, но, безусловно, их легче набирать).
Простой пример
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';
должно работать.
value ~* '\yAB\y'
работает нормально. Ваша заметка относится к версии 9.2?
- person Alexander Gonchiy; 07.02.2016
... 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
phrase ILIKE '% cto %
, вам просто нужно добавить пробелы вокруг фразы: ' ' || phrase || ' ' ILIKE '% cto %'
. Это будет работать для заголовка как «cto». Спасибо, потому что ваша идея помогла мне найти это решение: сопоставить границы слов postgresql 9"> stackoverflow.com/questions/18080104/
- person Stepan Zakharov; 05.11.2017