Как видно из заголовка выше, я пытаюсь сослаться на группы захвата для замены регулярных выражений в запросе postgres. Я читал, что regex_replace не поддерживает использование групп захвата регулярных выражений. Я использую регулярное выражение
r"(?:[\s\(\)\=\)\,])(username)(?:[\s\(\)\=\)\,])?"gm
Приведенное выше регулярное выражение почти делает то, что мне нужно, но мне нужно выяснить, как разрешить совпадение только в том случае, если группы захвата также что-то захватывают. Нет ситуации, когда имя пользователя должно совпадать, если оно является подстрокой слова. Обеспечив его окружение одним из вышеперечисленных, я могу гораздо более уверенно гарантировать, что это имя пользователя.
Пример применения регулярного выражения будет примерно таким в postgres (конечно, я буду делать обновление вместо выбора):
select *, REGEXP_REPLACE(reqcontent,'(?:[\s\(\)\=\)\,])(username)(?:[\s\(\)\=\)\,])?' ,'NEW-VALUE', 'gm') from table where column like '%username%' limit 100;
Если есть еще контекст, который можно предоставить, пожалуйста, дайте мне знать. Я также нашел похожие сообщения (postgresql regexp_replace: как заменить захваченную группу оценочным выражением (добавление целочисленного значения в группу захвата)), но это больше говорит о объединении значений обратно, и я не думаю, что полностью отвечает на мой вопрос.
Больше контекста и примеров значений для регулярных выражений работают против. Текст ниже может показаться вам знакомым — это фильтры JQL в Jira. Мы хотим обновить наши имена пользователей и все их вхождения в таблицу, содержащую фильтр. Ниже приведены несколько примеров фильтров. Первоначально мы просто выполняли поиск замены, но это не сработало, потому что у нас есть некоторые имена пользователей, состоящие всего из двух символов, и они совпадали с именами, отличными от имен пользователей (например, je (имя пользователя) поместит новое значение в место, где находится слово проект что полностью искажает JQL/String, что приводит к чему-то вроде proNEW-VALUEct = balh blah)
type = bug AND status not in (Closed, Executed) AND assignee in (test, username)
assignee=username
assignee = username
Определение ответа:
- Регулярное выражение, которое будет соответствовать «имени пользователя», только если оно окружено одним из специальных
- Способ регулярного выражения/замены этого имени пользователя в запросе postgres.
REGEXP_REPLACE(reqcontent,'\yusername\y' ,'NEW-VALUE', 'gm')
10.09.2020