Регулярные выражения Postgresql ищут слово без учета регистра и игнорируют диакритические знаки - PullRequest
1 голос
/ 11 октября 2019

В моей таблице движений я должен сопоставить все значения описания, которые содержат слово: 'depósito'.

Он должен быть нечувствительным к регистру и игнорировать диакритические знаки, поскольку может быть:

Deposito
DEPOSITO
deposito
DEPÓSITO

и т. Д. В любой части предложения description.

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Без учета регистра легко воспользоваться оператором сопоставления регулярных выражений ~* (вместо ~).

Когда дело доходит до диакритики, я не уверен, что существует стандартный способ. Вам, вероятно, нужно перечислить варианты.

Кроме того, поскольку вы ищете целое слово, было бы хорошо использовать границы слов для его разделения: \y или \\y в зависимости от того, отключена ли настройка базы данных standard_conforming_strings.

Обратите внимание:

description ~* '\ydep[oó]sito\y'

Примечание по диакритическим знакам: в документации упоминается расширение под названием unaccent, которое можно использовать для удаления акцентов. После установки и настройки вы можете сделать что-то вроде:

unaccent(description) ~* '\ydeposito\y'
0 голосов
/ 11 октября 2019

Нет элегантного способа добиться этого в регулярном выражении (хотя это достижимо), но вы можете использовать как функцию unaccent (доступную из расширения unaccent, так и оператор регулярного выражения без учета регистра.

Например:

CREATE EXTENSION unaccent;

SELECT unaccent('depósito') ~* 'deposito';

Оператор ~ * здесь выполняет сопоставление с образцом без учета регистра, а функция unaccent удаляет акценты из искомого исходного значения, поэтому даже если мы добавим дополнительные акценты и заглавные буквы,мы получаем следующий результат:

# SELECT unaccent('whatever 123 dépósITo hello') ~* 'DEPOSiTO';
 ?column? 
----------
 t
(1 row)

Раскрытие информации: Я EnterpriseDB (EDB) сотрудник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...