Функции на regexp_replace приводят к Postgres

У меня есть база данных адресов, где аббревиатуры были разделены пробелом, я хочу удалить эти пробелы, поэтому я обратился к надежным регулярным выражениям. Тем не менее, я изо всех сил пытаюсь выполнить дополнительную функцию для результата регулярного выражения '\&' - я проверил форумы и документы и просто не могу заставить это работать. Пример данных у меня выглядит следующим образом:

  • "A V C Welding" должен быть "A V C Welding"
  • "H S B C" должен быть "H S B C"
  • так далее..

У меня есть следующее регулярное выражение:

trim(regexp_replace(organisation || ' ', '(([A-Z]\s){1}){2,}', replace('\&',' ',''), 'g'))

replace('\&',' ','') не имеет никакого эффекта вообще, я просто получаю ту же строку обратно. Я пробовал другие функции, например lower('\&') и ни один из них, кажется, не работает как ожидалось. Конкатенация с || работает, однако. Я пытался привести '\ &' к тексту, пытался replace('' || '\&' || '',' ','') - все равно нет радости.

Любой совет будет высоко ценится, я уверен, что решение очень простое, но я просто не вижу, куда идти дальше!

1 ответ

Решение

Что вы пытаетесь сделать с \& никогда не сработает. \& шаблон заменит весь шаблон, но вам нужно решение, которое работает на отдельных частях.

Что вам нужно, это заменить шаблон CAPITAL-space просто CAPITAL но только когда за ним следует другая заглавная буква, которая не является началом более длинного слова. Другими словами: вам нужен отрицательный взгляд, и если шаблон соответствует, то замените только первый атом строки замены:

select regexp_replace('A V C Welding', '([A-Z]){1}(\s){1}(?![A-Z][a-z])', '\1', 'g');

При необходимости вы можете заменить шаблон с отрицательным прогнозом на что-то более широкое (например, без начальных букв, цифр, знаков пунктуации и т. Д.).

Другие вопросы по тегам