Nano Hash - криптовалюты, майнинг, программирование

Как использовать Postgres Regex Заменить группой захвата

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

  • Postgres поддерживает группы захвата с REGEXP_REPLACE. Не могли бы вы немного рассказать нам о том, что должен делать этот длинный шаблон регулярного выражения, возможно, добавив некоторые образцы данных? 09.09.2020
  • @TimBiegeleisen спасибо за ответ. Я предоставил больше контекста выше, а также добавил несколько текстовых примеров, пожалуйста, дайте мне знать, если можно предоставить больше контекста. 09.09.2020

Ответы:


1

Группы захвата используются для того, чтобы важные биты информации соответствовали регулярному выражению.

Используйте любую группу захвата вокруг частей строки, которые вы хотите оставить в результате, и используйте их заполнители в замене:

REGEXP_REPLACE(reqcontent,'([\s\(\)\=\)\,])username([\s\(\)\=\)\,])?' ,'\1NEW-VALUE\2', 'gm')

Или используйте обходные пути:

REGEXP_REPLACE(reqcontent,'(?<=[\s\(\)\=\)\,])(username)(?=[\s\(\)\=\)\,])?' ,'NEW-VALUE', 'gm')

Или, в этом случае, используйте границы слов, чтобы гарантировать, что вы заменяете слово только внутри специальных символов:

REGEXP_REPLACE(reqcontent,'\yusername\y' ,'NEW-VALUE', 'g')
09.09.2020
  • Осмотр, похоже, не поддерживается в регулярном выражении postgres. Регулярное выражение не может совпадать с одной буквой в слове, но должно гарантировать, что все имя пользователя обернуто одним из этих специальных предложений, и только тогда оно будет действительным. Имеет ли это смысл? Например, если бы у нас было два случая. project = myProject, если я ищу пользователя j (имя пользователя), то он не может соответствовать j в проекте. Он может соответствовать только в том случае, если он окружен () = \ s. Похоже, что регулярное выражение, которое я разместил в качестве примера работы, на самом деле не делает то, что я думал, и я обновлю свое описание выше. 09.09.2020
  • Похоже, что первый ответ сработает, заключив имя пользователя во внешние группы захвата. Это заставило меня понять, что мое регулярное выражение отключено. Мне нужно обеспечить соответствие групп захвата, и если они не совпадают, это не следует считать совпадением. 09.09.2020
  • Да, группы захвата более распространены и обычно поддерживаются всеми разновидностями регулярных выражений, поэтому это первое предлагаемое решение. 09.09.2020
  • Верно.. У вас есть способ принудительно использовать группы захвата? Текущее регулярное выражение по-прежнему будет совпадать с одиночными символами в другой строке и не будет строго следить за тем, чтобы оно было окружено одним из специальных символов. 09.09.2020
  • @CoreySmith Используйте границы слов, REGEXP_REPLACE(reqcontent,'\yusername\y' ,'NEW-VALUE', 'gm') 10.09.2020
  • Собираюсь отметить это как правильное. Окончательный ответ: ([\s()\=)\,])\yusername\y([\s()\=)\,])? с использованием границ слов и в запросе типа REGEX_REPLACE(column, '([\s()\=)\,])\bbhauwd\b([\s()\=)\,])?" , '\1NEW-VALUE\2', 'гм'). Спасибо вам за помощь 10.09.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..