как можно смотреть за позитивной работой в pgsql regexp_replace? - PullRequest
1 голос
/ 27 марта 2019

Самый простой тест, который я сделал, это:

SELECT regexp_replace((09,09,41,41,42,42,49,49,49,49,200,200,400,400,500,500), '(?<=,|^)([^,]*)(,\\1)+(?=,|$)', '\\1') AS lignes

Я бы хотел, чтобы regex101 показал мне: 09,41,42,49,200,400,500.Но вся строка пришла.Любая помощь?

1 Ответ

1 голос
/ 27 марта 2019

Прежде всего, вам не нужно удваивать обратную косую черту, если не включено standard_conforming_strings:

standard_conforming_strings (boolean)

Это контролирует, обрабатывают ли обычные строковые литералы ('...') обратную косую черту буквально, как указано в стандарте SQL. Начиная с PostgreSQL 9.1, по умолчанию включено (предыдущие версии по умолчанию выключены). Приложения могут проверить этот параметр, чтобы определить, как будут обрабатываться строковые литералы. Наличие этого параметра также может рассматриваться как указание на то, что синтаксис escape-строки (E '...') поддерживается. Синтаксис Escape-строки ( Раздел 4.1.2.2 ) следует использовать, если приложение хочет, чтобы обратные слеши обрабатывались как escape-символы.

Далее необходимо использовать глобальный модификатор g для замены всех совпадений, см. 9.7. Сопоставление с образцом сечение :

Флаг i задает сопоставление без учета регистра, а флаг g указывает замену каждой совпадающей подстроки, а не только первой.

Используйте

SELECT regexp_replace('09,09,41,41,42,42,49,49,49,49,200,200,400,400,500,500', '(?<=,|^)([^,]*)(,\1)+(?=,|$)', '\1', 'g') AS lignes

enter image description here

См. Онлайн-демонстрацию .

Если вы хотите сделать шаблон более эффективным, используйте двойное отрицание:

'(?<![^,])([^,]*)(,\1)+(?![^,])'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...